【问题标题】:How to query a dictionary that looks uniterable?如何查询看起来可统一的字典?
【发布时间】:2020-04-01 20:42:41
【问题描述】:

这是我的观点.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 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()

【问题讨论】:

  • 那不是字典,那是QuerySet,而individual Products确实是不可迭代的。
  • 你能分享你的CartProduct 模型吗,太复杂了。 Django 可以帮助你过滤相关的对象。
  • 这个集合看起来是可迭代的
  • @Fnechz:请edit你的问题。
  • @WillemVanOnsem 我已经编辑过了。

标签: django python-3.x django-queryset


【解决方案1】:

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

您可以通过以下查询获得不同 Product 对象的 QuerySet

Product.objects.filter(<b>cart__isnull=False</b>)<b>.distinct()</b>

编辑

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

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

【讨论】:

  • 我现在明白了,但我想要一种方法可以返回最畅销的商品,然后在 django 模板中显示它们。那么我将如何查询你给我的查询集。 PS:我还是 django 的新手
  • @Fnechz:最好的 per 购物车,或所有这些产品。什么是“最畅销”的商品?你是如何订购这些的?
  • 所有产品在所有购物车中
  • @Fnechz:所以您想要大部分 Carts 中的Product
  • 这似乎可行,那么我将如何在 django 模板中呈现 best_product 呢?
猜你喜欢
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
相关资源
最近更新 更多