2010-01-04 5 views
0

У меня есть несколько моделей, у которых есть FK для одной модели. Все, что я знаю, это FK, как я могу определить, какая из моделей оснащена FK?Запросить несколько моделей с одним значением

Ниже приведен пример для clearify:

class ModelA(models.Model): 
     title = models.CharField("title", max_length=80) 

class ModelB(models.Model): 
     fk = models.ForeignKey(ModelA) 

class ModelC(models.Model): 
     fk = models.ForeignKey(ModelA) 

Как я могу понять, без использования Try/за исключением каждой модели есть ли B или C в FK? (The FK может быть только в одном из них, для записи в этом случае я только добавил две модели, но в реальном мире приложениях Есть несколько возможно й количество моделей, которые имеют FK для Modela)

ответ

0
if ModelB.objects.filter(fk=your_fk): 
    print "B" 
else: 
    print "C" 

, если вы не уверены, присутствует ли в любом B или C это Ф.К. вообще, добавьте еще одну проверку:

if ModelB.objects.filter(fk=your_fk): 
    print "B" 
elif ModelC.objects.filter(fk=your_fk): 
    print "C" 
else: 
    print "none" 
+0

Но я чувствую, что это слишком похоже, чтобы попробовать/за исключением вы упомянули , Что случилось с try/except? Вы хотите использовать один запрос базы данных для проверки обоих результатов? –

+0

позволяет предположить, что у меня 20 моделей, я не хочу пытаться/кроме всех них. Мне было интересно, есть ли способ запросить, чтобы проверить все модели на результат. В противном случае я должен сделать промежуточную модель. – swoei

+0

Какова ваша цель - оптимизация времени (чтобы сделать один сложный запрос вместо 20 простых) или просто синтаксическим удобством? –

0

Если, как вы сказали, что есть много моделей с ForeignKeys до ModelA может быть, вы должны рассмотреть вопрос о поле в ModelA, который кэширует эту информацию? Он может быть обновлен методом save()ModelB/C/.. или хранимой процедурой базы данных.

+0

Как насчет этого ответа? –

0

Если вы после синтаксического сахара и восстанавливающего количество запросов, попробуйте следующее:

a=ModelA.objects.annotate(nb=Count('modelb'), nc=Count('modelc')).get(pd=your_fk) 
if a.nb: 
    return 'B' 
elif a.nc: 
    return 'C' 
else: 
    return 'A' 

(Джанго> = v1.1)

Смежные вопросы