Запрос нескольких моделей с одним значением - PullRequest
0 голосов
/ 04 января 2010

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

Ниже приведен пример для уточнения:

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)

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

Ответы [ 3 ]

0 голосов
/ 04 января 2010

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

0 голосов
/ 05 января 2010

Если вам нужен синтаксический сахар и сокращается количество запросов, попробуйте это:

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'

(django> = v1.1)

0 голосов
/ 04 января 2010
if ModelB.objects.filter(fk=your_fk):
   print "B"
else:
   print "C"

если вы не уверены, присутствует ли этот fk вообще в B или C, добавьте еще одну проверку:

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