“列表”列表上的Django过滤器查询集

问题描述 投票:0回答:1

请使用标题的措词,也许这不是正确的说法,但我无法提出更好的标题。

我有一个名为People的模型,并通过某种方式来识别一群我想通过了解他们的城镇,街道和房屋,然后从数据库中查询来从数据库中获取的人。

class People(models.Model):
    town = models.ForeignKey(Town, on_delete=models.CASCADE)
    street = models.ForeignKey(Street, on_delete=models.CASCADE)
    house = models.ForeignKey(House, on_delete=models.CASCADE)

我可以使用People.objects.get(...)如下一对一地获取它们,但是当我需要访问许多文件时,由于数据库连接的打开和关闭,这会产生滞后。

result = People.objects.get(town_id=tid, street_id=sid, house_id=hid)

如果我有下面列出的代表tid sidhid的查询列表,我可以在一个数据库事务中以某种方式完成所有这些操作吗?此列表可以轻松增长到1000个条目或更多。

queries = [
    [1, 1, 1]
    [1, 1, 2]
    [2, 1, 1]
    [5, 9, 1]
    [13, 40, 2]
]
django django-models django-database
1个回答
0
投票

如果需要查询确切的组合,则需要首先注释查询集以构造三个ID的串联:

from django.db.models.functions import Cast, Concat
from django.db.models import CharField, Value

queries = [",".join(elem) for elem in queries]
People.objects.annotate(address=Concat(
        Cast('town_id', output_field=CharField()), Value(','),
        Cast('street_id', output_field=CharField()), Value(','),
        Cast('house_id', output_field=CharField()
    )).filter(address__in=queries)
© www.soinside.com 2019 - 2024. All rights reserved.