【问题标题】:Get distinct titles from product list with min and max price of that product title in django从产品列表中获取不同的标题,并在 django 中使用该产品标题的最低和最高价格
【发布时间】:2021-11-03 06:43:56
【问题描述】:

我有同名但价格不同的产品列表。

这是我的产品型号:

class Product(BaseModel):
    title = models.ForeignKey(
        ProductTitle,
        on_delete=models.CASCADE,
        related_name="product_title",
        null=True,
        blank=True,
    )
    quantity = models.PositiveIntegerField(default=1)
    price = models.FloatField(validators=[MinValueValidator(0.00)])
    unit = models.CharField(
        max_length=20,
        blank=True,
        null=True,
        help_text="Standard measurement units.eg: kg, meter,etc..",
    )
    description = models.TextField(
        blank=True, null=True, help_text="Short Info about Product"
    )
    slug = models.SlugField(null=False, unique=True)

比如说,我有 10 个同名但价格不同的产品,其他产品也是如此。现在我想获得特定标题的单一(不同)产品,该产品的最低和最高价格等等。所以,我应该说橙色的最低和最高价格,苹果的最低和最高价格等等。

我尝试了一些方法,但它不起作用。就像在这个查询中它给了我一样:

product_qs = (
            Product.objects.filter(is_deleted=False)
            .order_by("title__title")
            .distinct("title__title")
        )
p_list = product_qs.values_list("title", flat=True)

product_list = product_qs.filter(title__in=p_list).annotate(
            max_price=Max("price"), min_price=Min("price")
        )
NotImplementedError at /api/product/unique_product/
annotate() + distinct(fields) is not implemented.

谁能帮我解决这个问题

【问题讨论】:

    标签: python sql django django-queryset distinct


    【解决方案1】:
    from django.db.models import Min, Max
    
    Product.objects.values('title__title').annotate(min_val=Min('price'), max_val=Max('price')).order_by()
    

    这将返回:

    字典列表,包含distinct title min_pricemax_price

    SQL 等效项:

    SELECT title, max(price) AS max_val, min(price) AS min_val FROM product_table GROUP_BY title;
    

    values() 用于GROUP BYannotate() 用于 MIN 和 MAX:

    【讨论】:

    • 我想要具有最低和最高价格的独特产品。您的答案没有给出明确的答案,它还应该具有类似产品的最低价格和最高价格
    • 它实际上返回一个字典列表,包含不同的标题、min_price 和 max_price。你得到什么输出?
    • 是的,但我的要求是 pk 1 应该有单个标题,并且应该有 max_price 和 min_price。您的代码给出了标题 1 的产品与最大值、最小值和标题 1 的产品及其最大值、最小值。 django 中应该有一个叫做 distinct product title 的单。
    • 您的代码将给出: [{'title': 1, 'title__title': 'Gaurabproduct', 'min_val': 10.0, 'max_val': 10.0}, {'title': 1, ' title__title': 'Gaurabproduct', 'min_val': 30.0, 'max_val': 30.0}, {'title': 1, 'title__title': 'Gaurabproduct', 'min_val': 20.0, 'max_val': 20.0}] 所以在这里Gaurabproduct 具有三种不同的最低/最高价格。我想要从这三个 Gaurabproduct 计算出的具有最小值/最大值的单个 Gaurabproduct
    • 好的,代码略有变化,因为这里的标题是外键,而不是字符串。更新并等待
    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 2013-04-29
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多