这是一个例子:
型号
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个查询。