首页 > 解决方案 > 在 django 项目中迭代两个不同模型的最有效方法是什么

问题描述

我正在开发一个 django 网站。我的模板中有一个产品页面,其中有多个类别,每个类别下有多个产品。这些是我的models.py:

class Category(models.Model):
    type=models.CharField(max_length=30)
class Product(models.Model):
    category = models.ForeignKey(Category, on_delete = models.CASCADE)
    productid=models.CharField(max_length=30)
    name=models.CharField(max_length=30)

这是我当前的 view.py:

def category(request,sort):
    b=""
    if sort=="all":
        b="timeadded"
    elif sort=="new":
        b="-timeadded"
    context = {
         
        'types' : Category.objects.all(),
        'prods': Product.objects.filter().order_by(b),
        'cartItems':[],
   
    }
    if request.user.is_authenticated:
        customer=request.user.customer
        order, created=Order.objects.get_or_create(customer=customer, complete=False)
        cartItems=order.get_cart_items,     
        items=order.orderitem_set.all()
        context['list_cart'] = order.orderitem_set.values_list('product__id', flat=True)    
    return render(request,"category.html",context)

此视图负责产品是否已在客户购物车中。目前为了展示这些产品,我正在这样迭代:

{% for type in types %}
{% for product in prods %}
{% if product.type.id == type.id %}}
//Display the details
{% endif %}
{% endfor %}
{% endfor %}

最初,当我没有添加很多产品时,这对我来说效果很好,但是现在当我用大约 400 种产品进行测试时,它的加载速度非常慢。原因可能是我正在迭代所有类别的所有产品。请告诉我一种更有效的方法来解决这个问题,同时记住产品是否在购物车中,以及如何在我的模板中迭代。谢谢。

标签: pythondjango

解决方案


您可以 fdirst fdetch 所有的Products,然后按类型对它们进行分组,例如:

from itertools import groupby
from operator import attrgetter

def category(request,sort):
    sorting = ['category_id']
    if sort == 'all':
        sorting.append('timeadded')
    elif sort == 'new':
        sorting.append('-timeadded')
    qs = Product.objects.select_related('category').order_by(*sorting)
    types = [
        (k, list(vs))
        for k, vs in groupby(qs, attrgetter('category'))
    ]
    context = {
        'types' : types,
        'cartItems':[],
    }
    if request.user.is_authenticated:
        customer=request.user.customer
        order, created=Order.objects.get_or_create(customer=customer, complete=False)
        cartItems=order.get_cart_items,     
        items=order.orderitem_set.all()
        context['list_cart'] = order.orderitem_set.values_list('product__id', flat=True)    
    return render(request,"category.html",context)

在模板中,我们可以遍历键值元组:

{% for category, prods in types %}
    <b>{{ category.type }}</b>
    {% for product in prods %}
        {{ product.name }}
    {% endfor %}
{% endfor %}

推荐阅读