如何查询看起来统一的字典?
How to query a dictionary that looks uniterable?
这是我的views.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/ 处收到 TypeError,即 Product 对象不可迭代。
这是 unique_of_unique 字典在错误页面
中的样子
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
的数量增长,那么数据库当然也会增长。
您可以使用以下查询获得 QuerySet
个不同的 Product
对象:
Product.objects.filter(<b>cart__isnull=False</b>)<b>.distinct()</b>
编辑:
你可以得到Cart
个数最多的Product
:
from django.db.models import Count, Value
from django.db.models.functions import Coalesce
best_product = Product.objects.annotate(
<b>n_cart=Coalesce(Count('cart'), Value(0))</b>
).order_by('-n_cart').first()
这是我的views.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/ 处收到 TypeError,即 Product 对象不可迭代。 这是 unique_of_unique 字典在错误页面
中的样子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
的数量增长,那么数据库当然也会增长。
您可以使用以下查询获得 QuerySet
个不同的 Product
对象:
Product.objects.filter(<b>cart__isnull=False</b>)<b>.distinct()</b>
编辑:
你可以得到Cart
个数最多的Product
:
from django.db.models import Count, Value
from django.db.models.functions import Coalesce
best_product = Product.objects.annotate(
<b>n_cart=Coalesce(Count('cart'), Value(0))</b>
).order_by('-n_cart').first()