Django фильтр запросов по списку «списков» - PullRequest
0 голосов
/ 07 февраля 2020

Извините за формулировку названия, возможно, это неправильный способ сказать это, но я не могу придумать лучшего.

У меня есть модель под названием Люди, и с помощью некоторых средств идентификации группа людей, которых я хочу получить из базы данных, зная их город, улицу и дом, а затем запросив их у базы данных.

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]
]

1 Ответ

0 голосов
/ 07 февраля 2020

Если вам нужно запросить точные комбинации, вам нужно сначала аннотировать ваш набор запросов, чтобы создать объединение трех идентификаторов:

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)
...