python - 在 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 种产品进行测试时,它的加载速度非常慢。原因可能是我正在迭代所有类别的所有产品。请告诉我一种更有效的方法来解决这个问题,同时记住产品是否在购物车中,以及如何在我的模板中迭代。谢谢。
解决方案
您可以 fdirst fdetch 所有的Product
s,然后按类型对它们进行分组,例如:
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 %}
推荐阅读
- angular - 使用 Angular 获取外部 url 的元数据
- python - 按文件名加载 python 脚本源以进行测试
- mysql - sql - 在数值后添加 0
- python - \_tfq_simulate_ops.so 导入 tensorflow_quantum 时未找到
- react-native - 使用本机反应将 content:// uri 转换为 file:// uri
- jenkins - 更新 Jenkins 插件的问题
- javascript - 使用 nodej 和 sqlite3 构建关系数据库
- sql-server - 将数据库的所有权限授予用户
- nodemailer - 尝试通过 nodemailer 和 mailgun 发送电子邮件时出现 TypeError
- c++ - C++ OpenProcess 使用 Admin Privilege IDE 成功,但在 Admin CMD 中执行时失败