gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:34:20 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com