首页 > 解决方案 > 如何查询看起来可统一的字典?

问题描述

这是我的意见.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()

标签: djangopython-3.xdjango-queryset

解决方案


没有必要像那样查询数据库。实际上,这将导致N+1 问题,对于每个Cart对象,您查询数据库一次。如果Carts 的数量增长,那么数据库当然也会增长。

您可以使用以下查询获得QuerySet不同的对象:Product

Product.objects.filter(cart__isnull=False).distinct()

编辑

您可以通过以下方式获得Product最大数量的Carts:

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()

推荐阅读