这是一个例子:

型号

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


如何在不使用“ for”的情况下有效地获取每个类别包含6种产品的列表?

最佳答案

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个产品查询。一个for循环。

我的版本:1个查询。

09-10 04:17
查看更多