2010-09-24 17 views
6

Ich versuche, ein Modell zu tun wählen Sie eine Beziehung mit einem generischen Fremdschlüssel verwenden, aber es funktioniert nicht wie erwartet.Django generic Fremdschlüssel und select_related

Ich denke, es ist besser dargestellt und verständlich mit Code

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") 

Nur klar sein, ich möchte, dass diese Linie gearbeitet: ModelA.objects.filter(modelb__content_object=modelCInstance), offenbar django nicht mit content_object auf Filterbeziehungen unterstützt.

Vielen Dank im Voraus!

+0

Was erwarten Sie? Wir können keine Frage beantworten, wenn es keine gibt. –

+0

Ich habe den Beitrag bearbeitet, um es klarer zu machen, sorry – Clash

Antwort

9

Werfen Sie einen Blick auf http://www.djangoproject.com/documentation/models/generic_relations/. Und versuchen:

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

haben Sie einen Blick auf einige django coding/naming conventions, Ihren Code leichter zu lesen und zu verstehen!

+0

Danke für die Tipps! Ist das der einzige Weg? Ich war auf der Suche nach etwas freundlicher, danke sowieso! – Clash

+2

Da Content usw. sind nicht Teil des django Kern der eingebaute in 'filter' nicht weiß, wie solche Anfragen zu bearbeiten, so dass Sie sich für content_type filtern sind und die object_id! –

Verwandte Themen