2011-12-11 20 views
5

ManyToMany ilişkisi içinde belirli bir nesnenin varlığını kontrol etmek istiyorum. Örneğin:ManyToMany ilişkisinde nesnenin varlığını kontrol etme (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 

[some query] Benim ilk bıçaklama A.objects.all().annotate(Count(has_object='members__id=1')) ama Count için argüman içine alan adı başka bir şey koyamazsınız gibi görünüyor. Bunu yapmanın başka yolu var mı?

cevap

2
, bu nasıl oldukça emin many-to-many prefetching arada

1.4 uygulanan alana kadar saf Python bunu yapmanın herhangi terbiyeli performans yolu var olmayacak olduğunu

A.objects.filter(members__id=1).exists() 
deneyebilirsiniz ben

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

tabii ki, daha basit bir yolu basitçe iki ayrı Sorgu kümelerini üzerinde işlem için kodunuzu refactor olacaktır: SQL içine aşağı bırakarak bunu 'd

results_with_member_1 = A.objects.filter(members__id=1) 
results_without_member_1 = A.objects.exclude(members__id=1) 
İlgili konular