【问题标题】:Merge duplicate values in django query合并Django查询中的重复值
【发布时间】:2021-01-12 21:48:38
【问题描述】:

我有一个 SQL 查询,但我想知道如何以 Django 格式 (PostgreSQL) 编写。我是 django 的新手 :)

假设,我们在这样的表中有数据。

1: Color: Pink,    Size: 1M 
2: Color: Pink,    Size: 2M
3: Color: Red,     Size: 1M
4: Color: Red,     Size: 3M
5: Color: Yellow,  Size: 2M

期待输出

Pink
Red
Yellow

我正在通过以下查询获得输出。但我想知道,如何在 django 中查询和合并重复值

// id = product_id
colors = Variants.objects.raw('SELECT * FROM  product_variants  WHERE product_id=%s GROUP BY color_id',[id])

型号:

class Variants(models.Model):
    title = models.CharField(max_length=100, blank=True,null=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    color = models.ForeignKey(Color, on_delete=models.CASCADE,blank=True,null=True)
    size = models.ForeignKey(Size, on_delete=models.CASCADE,blank=True,null=True)
    image_id = models.IntegerField(blank=True,null=True,default=0)
    quantity = models.IntegerField(default=1)
    price = models.DecimalField(max_digits=12, decimal_places=2,default=0)

Variants model

【问题讨论】:

  • 能分享一下相关型号吗?我并不完全清楚您是如何构建数据的。
  • 我更新了我的问题! @WillemVanOnsem
  • 请edit问题,评论没有缩进:)。
  • 我更新了我的问题! @WillemVanOnsem

标签: django django-views django-queryset


【解决方案1】:

您可以通过以下方式查询:

Color.objects.filter(variants__product_id=<i>productid</i>)<b>.distinct()</b>

这将给出Color 对象,其中有给定产品的变体。 .distinct() [Django-doc] 调用用于检索每种颜色最多一次。

【讨论】:

  • 假设,正如我在问题中提到的,我们有一个包含颜色和尺寸的表格。我们如何一次检索重复值?或者我们可以在查询后过滤数据吗?
  • @SarmadNawab:你可以用Variants.objects.filter(product_id=productid).values_list('color', flat=True).distinct()查询,但是有点“丑”。
  • Variants.objects.filter(product_id=id).distinct('color_id') 这样我得到了我的预期输出。我是从您的共享参考资料.distinct() Django-docs 中得到的
  • @SarmadNawab:但这将返回 Variants 对象。此外,这只适用于 PostgreSQL。如果您想使用Color,则返回Variants 没有多大意义,您可以查询给定Color 的Variants,这实际上对于Prefetch 对象docs.djangoproject.com/en/dev/ref/models/querysets/#Prefetch 是有效的
猜你喜欢
  • 1970-01-01
  • 2014-07-08
  • 2021-03-19
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多