簡體   English   中英

如何過濾Django QuerySet的相關字段''all'或'none'

[英]How to filter a Django QuerySet's related fields' 'all' or 'none'

例如,我有一個模型Cat ,它有一個來自Life的反向ForeignKey

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')
     ...

如何獲得一個沒有丟失生命的CatQuerySet 即他們的所有生活要么處於“活着”狀態,要么屬於cat_type“schroedinger”,而且他們的生命中沒有一個人處於“死亡”狀態。

我暫時沒有使用過這個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)

有關使用Q()對象進行復雜查找的 django文檔,請參閱docs

除此之外:這只會執行一個數據庫查詢

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM