从单个对象开始相关的预取 - 在第二次预取和计数和排序中首先进行

时间:2017-12-08 19:15:09

标签: django django-queryset

我有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)

我需要:

  • 获取公司的所有产品
  • 显示产品第一类
  • 计算每家公司的产品数量并显示
  • 通过reverse updated_at
  • 订购产品

我从:

开始
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')

没有预取工作。

  1. return Company.objects.filter(pk=company_pk).prefetch_related('products')
  2. 没有错误,但在模板中:

     {% for company in company_list %}
            {{ company.name}}
        {% endfor %}
    

    我循环甚至是一个,但没有给我任何东西。

    除此之外,我需要为每个产品添加第一个类别,并计算产品数量

    我正在考虑访问这样的东西:

    {{company.name}}
    
    {% for product in company.products %}
       {{ product.name }}
       {{ product.category }}
    

1 个答案:

答案 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