我有3个型号产品,公司类别。
class Product(Meta):
categories = models.ManyToManyField(Category)
company = models.ForeignKey(Company, related_name='products', on_delete=models.CASCADE)
updated_at = models.DateTimeField(auto_now_add=False, auto_now=True)
我需要:
我从:
开始1. Company.objects.get(pk=company_pk).prefetch_related('products')
会给我一个错误,因为get返回一个对象:
class CompanyProductListView(ListView):
model = Company
template_name_suffix = '_company_list'
def get_queryset(self):
company_pk = self.kwargs.get('pk')
return Company.objects.get(pk=company_pk).prefetch_related('products')
没有预取工作。
return Company.objects.filter(pk=company_pk).prefetch_related('products')
没有错误,但在模板中:
{% for company in company_list %}
{{ company.name}}
{% endfor %}
我循环甚至是一个,但没有给我任何东西。
除此之外,我需要为每个产品添加第一个类别,并计算产品数量
我正在考虑访问这样的东西:
{{company.name}}
{% for product in company.products %}
{{ product.name }}
{{ product.category }}
答案 0 :(得分:1)
此查询会有点复杂,但应该可以帮助您解决问题。
PS:我还没有对此进行过测试,但应该大部分都有效。一旦我有更多时间,我会深入了解。
首先,我们得到了我们想要的公司:
company = Company.objects.get(pk=company_pk)
然后我们会抓取所有产品的所有第一个类别,可以使用this question作为指南来完成:
first_categories = Category.objects.order_by('product__id', '-id').distinct('product__id')
现在我们使用first_categories来限制我们预取的数据量(给出不同的视角,我们将查询Product
模型而不是Company
模型)
product_list = Products.objects.filter(company=company).prefetch_related(
Prefetch('categories', queryset=first_categories)
)
def get_queryset():
company_pk = ...
company = ...
first_categories = ...
product_list = ...
return product_list