2013-07-30 2 views
3

Например, у меня есть модель Cat, которая имеет обратную сторону ForeignKey от Life.Как фильтровать связанные поля Django QuerySet '' all 'или' none '

class Life(models.Model): 
    state = models.CharField(choices=('alive', 'dead', 'unknown') 
    cat = models.ForeignKey('animals.Cat', related_name="lives") 


class Cat(models.Model): 
    name = models.CharField(max_length=12) 
    cat_type = models.CharField(choices=('normal', 'schroedinger') 
    ... 

Как я могу получить QuerySet из Cat s, которые не потеряли ни одного из их жизни? То есть есть всех своей жизни либо в состоянии «живой» или из cat_type «Шрёдингеровского» и не имеет ни одного из их жизни в состоянии «мертвый»)

ответ

1

Я убежище «т использовал этот API в то время, но я считаю, что это будет получить работу:

from django.db.models import Q 

normal_and_alive = Q(cat_type="normal") & ~Q(lives__state__in=["dead", "unknown"]) 
schroedinger_and_not_dead = Q(cat_type="schroedinger") & ~Q(lives__state="dead") 

cats = Cat.objects.filter(normal_and_alive | schroedinger_and_not_dead) 

Смотрите документацию к документации Джанго для complex lookups with the Q() object

в сторону: это выполнит только один запрос к базе данных

0
cats = Cat.objects.filter(id=-1) # make it an empty queryset 

temp = Cat.objects.filter(cat_type='normal') 
for one in temp: 
    cats |= one.lives.filter(state='alive') # set union 

temp = Cat.objects.filter(cat_type='schroedinger') 
for one in temp: 
    cats |= one.lives.exclude(state='dead') 

return cats 

нового ответ:

cats = Cat.objects.filter(id=-1) # make it an empty queryset 

temp = Cat.objects.filter(cat_type='normal') 
for one in temp: 
    if len(one.lives.exclude(state='alive')) == 0: 
     cats |= Cat.objects.filter(id=one.id) 

temp = Cat.objects.filter(cat_type='schroedinger') 
for one in temp: 
    if len(one.lives.filter(state='dead')) == 0: 
     cats |= Cat.objects.filter(id=one.id) 

return cats 
+0

Сколько будет ударов БД? 2, 3, количество кошек +2? – Kimvais

+0

Я не уверен, возможно, количество кошек + 3 – metaphy

+0

, если вы переместите поле состояния в Cat, может быть гораздо меньше ударов – metaphy

Смежные вопросы