我的架构与此类似(显然此架构已简化)
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
进行过滤。
这与您的第二种情况相同,同样它将在 pet
、class1
、class2
和 上加入一次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/