Django: эффективный способ получения ряда предметов на основе внешнего ключа - PullRequest
0 голосов
/ 30 мая 2018

Вот пример:

Models.py

class Category(models.Model):
    name = models.Charfield(max_length=120 blank=True, null=True, default=None)

class Product(models.Model):
    category = models.Foreignkey(Category)

Это то, что я сделал ранее:

products = [Product.objects.filter(category_id=i.id)[:6] for i in Category.objects.all()]

Как эффективно получить список, содержащий 6Продукты в категории без использования «для»?

1 Ответ

0 голосов
/ 30 мая 2018

У Postgres действительно хороший способ создать массив из подзапроса.Так что если вы используете Postgres, это будет работать для вас.

from django.db.models import OuterRef, Subquery

class Array(Subquery):
    template = 'ARRAY(%(subquery)s)'

product_sub = Product.objects.filter(category=OuterRef('pk'))

products = Category.objects.annotate(
    product_list=Array(product_sub.values('name')[:6])
).values_list('product_list', flat=True)

Этот способ более эффективен: давайте сравним с вашей версией

Ваша версия: 1 запрос для категорий + количество категорий, умноженное на1 запрос на продукцию.Один для цикла.

Моя версия: 1 запрос.

...