2010-09-24 4 views
6

J'essaye de faire sélectionner un modèle en utilisant une relation avec une clé étrangère générique, mais cela ne fonctionne pas comme prévu.Django générique clé étrangère et select_related

je pense qu'il est mieux illustré et compréhensible avec le 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") 

Pour être clair, je voudrais que cette ligne a fonctionné: ModelA.objects.filter(modelb__content_object=modelCInstance), apparemment django ne prend pas en charge content_object sur les relations de filtre.

Merci d'avance!

+0

Qu'attendez-vous? Nous ne pouvons pas répondre à une question s'il n'y en a pas. –

+0

J'ai édité le message afin de le rendre plus clair, désolé – Clash

Répondre

9

Jetez un oeil à http://www.djangoproject.com/documentation/models/generic_relations/. Et essayez:

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

S'il vous plaît jeter un oeil à un django coding/naming conventions, pour rendre votre code plus facile à lire et à comprendre!

+0

Merci pour les conseils! Est-ce le seul moyen? Je cherchais quelque chose de plus sympathique, merci quand même! – Clash

+2

Puisque ContentTypes ne fait pas partie du noyau django, le 'filter' intégré ne sait pas comment gérer de telles requêtes, vous devez donc vous-même filtrer pour content_type ET l'object_id! –

Questions connexes