"lists" 列表中的 Django 过滤器查询集
Django filter queryset on list of "lists"
请原谅标题的措辞,也许这不是正确的表达方式,但我想不出更好的表达方式。
我有一个名为 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
sid
和 hid
,我能否以某种方式在一个数据库事务中完成所有这些?此列表很容易增长到 1000 个条目或更多。
queries = [
[1, 1, 1]
[1, 1, 2]
[2, 1, 1]
[5, 9, 1]
[13, 40, 2]
]
如果您需要查询确切的组合,您需要先注释您的查询集以构建三个 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)
请原谅标题的措辞,也许这不是正确的表达方式,但我想不出更好的表达方式。
我有一个名为 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
sid
和 hid
,我能否以某种方式在一个数据库事务中完成所有这些?此列表很容易增长到 1000 个条目或更多。
queries = [
[1, 1, 1]
[1, 1, 2]
[2, 1, 1]
[5, 9, 1]
[13, 40, 2]
]
如果您需要查询确切的组合,您需要先注释您的查询集以构建三个 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)