2010-09-24 14 views
6

Estoy tratando de seleccionar un modelo utilizando una relación con una clave externa genérica, pero no está funcionando como se esperaba.clave externa genérica Django y select_related

creo que es mejor ilustrado y comprensible con el código de

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

Para que quede claro, me gustaría que esta línea funcionó: ModelA.objects.filter(modelb__content_object=modelCInstance), al parecer, Django no admite el uso de content_object en las relaciones de filtro.

¡Gracias de antemano!

+0

¿Qué esperas? No podemos responder una pregunta si no hay ninguna. –

+0

He editado la publicación para que quede más clara, lo siento – Clash

Respuesta

9

Eche un vistazo a http://www.djangoproject.com/documentation/models/generic_relations/. Y tratar:

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

favor, eche un vistazo a algunos Django coding/naming conventions, para que su código sea más fácil de leer y entender!

+0

¡Gracias por los consejos! ¿Es esta la única manera? ¡Estaba buscando algo más amigable, gracias de todos modos! – Clash

+2

Dado que los ContentTypes, etc. no forman parte del núcleo django, el 'filtro' integrado no sabe cómo manejar tales consultas, por lo que debe filtrar usted mismo para content_type Y object_id. –

Cuestiones relacionadas