Django按多个字段查询一个域

2024-06-25 06:03:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似于这个的模式(显然这个是简化的)

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的宠物和一只接种了疫苗的宠物的人(不一定是同一只宠物…)

有没有一种方法可以在同一个单域关系上使用多个条件进行查询

另外,我要写的真正的查询更类似于以下内容:

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

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


Tags: name宠物datemodelmodelsfilternullclass
1条回答
网友
1楼 · 发布于 2024-06-25 06:03:09

情况已经是这样了。在这个过滤器中,您对相同的一对多关系进行查询

事实上,你的问题是:

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模型上加入one,并在上过滤相同的Pet

对于第二种情况也是如此,它将在petclass1class2class3上连接一次,因此在相同的相关对象上执行过滤条件

如果要查询(可能)不同的对象,可以使用以下选项进行筛选:

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

相关问题 更多 >