在具有特定字段值的模型中获取对象或不在相关模型中

时间:2016-12-26 10:08:23

标签: python django django-orm

是pjango的新手,因此复杂的查询变得越来越困难。

  

我有一个模型AnimalHeat我想要一个动物   farm=1 AND sex='female' AND 动物的实例   Heat.is_active=True AND Heat.is_bred=False

的实例

这是我的模特。

class Animal(models.Model):

    farm = models.ForeignKey(Farm, related_name='farm_animals', on_delete=models.CASCADE)

    name = models.CharField(max_length=25)
    sex = models.CharField(max_length=7)

class Heat(models.Model):

    animal = models.ForeignKey(Animal, related_name='heats', on_delete=models.CASCADE)

    is_bred = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

到目前为止,我尝试了这个查询:

    Animal.objects.filter(
        farm=1, sex='female',
        heats__is_active=True,
        heats__is_bred=False
    )

如果动物实例有热记录,我可以获取数据但是当 NO HEAT RECORD 时我无法获取任何数据。

1 个答案:

答案 0 :(得分:2)

您可以使用Q()对象在两对条件之间使用 OR

from django.db.models import Q

Animal.objects.filter(
    (Q(farm=1) & Q(sex='female')) | 
    (Q(heats__is_active=True) & Q(heats__is_bred=False))
)

这将为您提供一个包含甚至没有Heat记录的动物的查询集。