python - Django通过多个字段查询OneToMany

标签 python django python-3.x

我的架构与此类似(显然此架构已简化)

class Pet(models.Model):
    name = TextField()
    date_vaccinated = DateTimeField(null=True)  # null indicates no vaccination
    owner = ForeignKey(Person, related_key="pet")

class Person(models.Model):
    name = TextField()


people_with_a_vaccinated_pet_named_rex = 
Person.objects.filter(pet__date_vaccinated__isnull=False, pet__name="Rex")

如最后一行所示,我正在尝试查找所有拥有名为 Rex 且也接种了疫苗的宠物的人。 我编写的查询将找到所有拥有名为 rex 的宠物和接种疫苗的宠物(不一定是同一只宠物..)的人

有没有办法在同一个 OneToMany 关系上使用多个条件进行查询?

P.S 我尝试编写的真实查询更类似于以下内容:

Person.objecs.filter(pet__class1__date__isnull=False, pet__class1__class2__class3__name="blabla")

我只想通过日期不为空的 class1 实例到达 class 3

最佳答案

情况已经就是这样。在此过滤器中,您可以对相同一对多关系进行查询。

确实,您的查询:

Person.objects.filter(
    pet__date_vaccinated__isnull=False,
    pet__name='Rex'
)

被转换为如下所示的数据库查询:

SELECT person.*
FROM person
INNER JOIN pet ON pet.owner = person.id
WHERE pet.date_vaccinated IS NOT NULL AND pet.name = 'Rex'

因此,我们在 Pet 模型上进行一个 JOIN,因此我们对相同 Pet 进行过滤。

这与您的第二种情况相同,同样它将在 petclass1class2 上加入一次class3,因此过滤条件是在同一个相关对象上执行的。

如果您想查询(可能)不同的对象,您可以使用以下内容进行过滤:

# get persons that have a Pet that has a name 'Rex',
# and a (possibly) different Pet that is vaccinated

Person.objects.filter(
    pet__date_vaccinated__isnull=False
).filter(
    pet__name='Rex'
)

关于python - Django通过多个字段查询OneToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57918888/

相关文章:

python - 将数字转换为 Pandas 数据框中的2位 float

python - 向量化 numpy 赋值

python - 根据条件使用外键计数注释 Django 查询集

python - 当 DateTimeField 等于当前日期和时间时,Django 执行函数

python - 大多数 pythonic3 dezip(?) 实现

python - 如何在另一个列表的前面插入一个列表?

python - 在 python 中使用 os.environ 修改 PATH 变量的开头

mysql - Django 查询返回一组特定的项目

python - TypeError : unorderable types: str() > float()

python - 测量函数在 Python 中运行和完成所需的时间