2010-09-24 6 views
6

Я пытаюсь сделать выбор модели с использованием отношения с общим внешним ключом, но он не работает должным образом.Внешний внешний ключ Django и select_related

Я думаю, что лучше иллюстрирована и понятно с кодом

class ModelA(models.Model): 
created = models.DateTimeField(auto_now_add=True) 

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

content_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
content_object = generic.GenericForeignKey() 

class ModelC(models.Model): 
number = models.PositiveIntegerField() 
bInstances = generic.GenericRelation(ModelB) 

# Creating an instance of A and C 
aInstance=ModelA.objects.create() 
cInstance=ModelC.objects.create(number=3) 

# Adding instance of C to the B_set of instance A 
aInstance.modelb_set.add(content_object=cInstance) 

# Select all ModelA instances that have C as content object? Does not work 
whatIWant = ModelA.objects.filter(modelb__content_object=modelCInstance) 

# Pseudo-solution, requires calling whatIWant.modelA 
whatIWant = cInstance.bInstances.select_related("modelA") 

Просто чтобы быть ясно, я хотел бы, чтобы эта линия работала: ModelA.objects.filter(modelb__content_object=modelCInstance), по-видимому, Джанго не поддерживает использование content_object на фильтровальных отношений.

Заранее благодарен!

+0

Что вы ожидаете? Мы не можем ответить на вопрос, если его нет. –

+0

Я отредактировал сообщение, чтобы сделать его более ясным, извините – Clash

ответ

9

Посмотрите на http://www.djangoproject.com/documentation/models/generic_relations/. И попробуйте:

ctype = ContentType.objects.get_for_model(modelCInstance) 
what_you_want = ModelA.objects.filter(modelb__content_type__pk=ctype.id, 
             modelb__object_id=modelCInstance.pk) 

Пожалуйста, посмотрите на какой-то Джанго coding/naming conventions, чтобы легче читать и понимать ваш код!

+0

Спасибо за советы! Это единственный способ? Я искал что-то более дружелюбное, спасибо в любом случае! – Clash

+2

Поскольку ContentTypes и т. Д. Не являются частью ядра django, встроенный 'filter' не знает, как обрабатывать такие запросы, поэтому вам нужно фильтровать себя для content_type И object_id! –

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