Как сделать набор запросов в django? - PullRequest
1 голос
/ 17 февраля 2020
item_list = Item.objects. filter(location_id=location_id)

image_list = Image.objects.filter(?????)

class Image(models.Model):
    item = models.ForeignKey(Item, models.on_delete=CASCADE)

Я хочу получить только те изображения, которые item_id в первом запросе item_list

1 Ответ

2 голосов
/ 17 февраля 2020

Вы можете использовать __in lookup [Django -doc] :

image_list = Image.objects.filter(<b>item__in=item_list</b>)

для некоторых баз данных, например MySQL которые иногда не подходят для оптимизации подзапросов, которые не являются динамическими c, может быть лучше сначала материализовать список Item с, а затем передать список идентификаторов в Django :

image_list = Image.objects.filter(item__in=<b>list(</b>item_list<b>)</b>)

Это указано в документации как:

Будьте осторожны при использовании вложенных запросов и понимайте характеристики производительности сервера базы данных (если сомневаетесь, тесты производительности!). Некоторые бэкэнды базы данных, особенно MySQL, не очень хорошо оптимизируют вложенные запросы. В этих случаях эффективнее извлечь список значений и затем передать его во второй запрос.

...