django - 如何查询看起来可统一的字典?
问题描述
这是我的意见.py
def best_selling_items_view(request):
data = Cart.objects.all()
product_obj = Product.objects.all()
best_selling = []
for item in data:
best_selling.append(item.products.all())
best_selling_unique = best_selling
unique_set = []
for product in best_selling_unique:
for item in product:
unique_set.append(item)
# print(set(unique_set))
unique_of_unique = list(set(unique_set))
print(unique_of_unique)
context={
'object': unique_of_unique,
}
return render(request, 'carts/best-selling.html', context)
当我尝试查询上下文字典时,我在 /best-selling/ that Product object is not iterable处得到 TypeError 。这是错误页面中 unique_of_unique dict 的样子
unique_of_unique
[<Product: G-string>,
<Product: Condoms>,
<Product: T-shirt>,
<Product: Sex robot>,
<Product: saleh>,
<Product: zap nacks>]
推车型号:
class Cart(models.Model):
user = models.ForeignKey(User, null=True, blank=True)
products = models.ManyToManyField(Product, blank=True)
subtotal = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
total = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
updated = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = CartManager()
def __str__(self):
return str(self.id)
产品型号:
title = models.CharField(max_length=120)
slug = models.SlugField(blank=True, unique=True)
description = models.TextField()
price = models.DecimalField(decimal_places=2, max_digits=20, default=39.99)
image = models.ImageField(upload_to=upload_image_path, null=True, blank=True)
featured = models.BooleanField(default=False)
active = models.BooleanField(default=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = ProductManager()
解决方案
没有必要像那样查询数据库。实际上,这将导致N+1 问题,对于每个Cart
对象,您查询数据库一次。如果Cart
s 的数量增长,那么数据库当然也会增长。
您可以使用以下查询获得QuerySet
不同的对象:Product
Product.objects.filter(cart__isnull=False).distinct()
编辑:
您可以通过以下方式获得Product
最大数量的Cart
s:
from django.db.models import Count, Value
from django.db.models.functions import Coalesce
best_product = Product.objects.annotate(
n_cart=Coalesce(Count('cart'), Value(0))
).order_by('-n_cart').first()
推荐阅读
- python - 如何在python中使用pyqt5将QSlider添加到主窗口的工具栏
- c - 如何在 C 命令行中采用逗号分隔的输入参数?
- vba - 如何修复从 32 位转换的 64 位 VBA PPT 的错误
- javascript - 不同的边界半径
- python - Keras 中的 VAE:如何定义端到端模型?
- python - quandl FXH1 下载数据
- javascript - 函数声明以及它们如何在当前范围内创建变量
- sql - 插入外键时出现语法错误
- java - Dropwizard仪表频率
- javascript - 带有 ui.bootstrap 的 Angularjs 和 jquery.datatable - 需要使用循环在 json 中显示条目