2011-12-11 11 views
5

Me gustaría comprobar la existencia de un objeto en particular dentro de una relación ManyToMany. Por ejemplo:Comprobación de la existencia del objeto en ManyToMany relation (Django)

class A(models.Model): 
    members = models.ManyToManyField(B) 

class B(models.Model): 
    pass 

results = [some query] 

for r in results: 
    print r.has_object // True if object is related to some B of pk=1 

Mi primer intento fue [some query]A.objects.all().annotate(Count(has_object='members__id=1')) pero parece que no puedo poner nada más que el nombre del campo en el argumento de Count. ¿Hay alguna otra forma de hacer esto?

Respuesta

2

I bastante seguro de que no habrá ninguna manera de realizar decentemente a hacer esto en Python puro hasta many-to-many prefetching se implementa en el 1,4

Mientras tanto, esto es como yo 'd hacerlo dejando caer hacia abajo en SQL:

results = A.objects.all().extra(
    select={ 
     'has_object': 'EXISTS(SELECT * FROM myapp_a_members WHERE a_id=myapp_a.id AND b_id=1)' 
    } 
) 

por supuesto, la manera más sencilla, simplemente habría que refactorizar el código para operar en dos QuerySets separadas:

results_with_member_1 = A.objects.filter(members__id=1) 
results_without_member_1 = A.objects.exclude(members__id=1) 
11

Puede intentar

A.objects.filter(members__id=1).exists() 
Cuestiones relacionadas