如何按列分组并选择按创建时间排序的对象

时间:2019-02-21 19:53:49

标签: python django django-models django-queryset

我有一个类似下面的模型,

class MusicData(BaseModel):
    name = models.CharField(max_length=100)
    url = models.URLField()
    description = models.TextField()
    age = models.CharField(max_length=25)
    language = models.ForeignKey(Language, on_delete=models.CASCADE, 
                                      related_name="music_data",
                                      related_query_name="music_data")
    count = models.IntegerField()
    last_updated = models.CharField(max_length=255)
    playlist = models.ForeignKey(PlayList, on_delete=models.CASCADE, 
                                      related_name="music_data",
                                      related_query_name="music_data")

我想获得MusicData,以便按名称分组,在每个分组中,获得最新的created_oncreated_on是{{1}中的DateTimeField })

假设我有以下数据

BaseModel

预期输出是

| Name        | Created On            |
| ----------- | -----------           |
| ABC         | 2019-02-22 1:06:45 AM |
| ABC         | 2019-02-22 1:07:45 AM |
| BAC         | 2019-02-22 1:08:45 AM |
| BAC         | 2019-02-22 1:09:45 AM |
| BAC         | 2019-02-22 1:10:45 AM |
| BBC         | 2019-02-22 1:11:45 AM |

我已经编写了此查询,在上述情况下可以正常工作

| Name        | Created On            |
| ----------- | -----------           |
| ABC         | 2019-02-22 1:07:45 AM |
| BAC         | 2019-02-22 1:10:45 AM |
| BBC         | 2019-02-22 1:11:45 AM |

但是,问题同models.MusicData.objects.filter(playlist__isnull=True).values( "name").annotate(maxdate=Max("created_on")) name一样,我还需要其他值,例如created_onnameurlagecount

所以我遵循了本指南:https://docs.djangoproject.com/en/2.1/topics/db/aggregation/#combining-multiple-aggregations

跟上这个查询,

playlist__name

但是,在这种情况下,我得到了重复的对象,然后检查了sql查询,发现了这一点

在第一种情况下,只有models.MusicData.objects.filter(playlist__isnull = True).values( "name").annotate(maxdate = Max("created_on")).values("age", "name", "description", "url", "count", "last_updated", "playlist", language = F( "language__name") ) 和联接很好,

但是在第二种情况下,GROUP BY name拥有我在值中指定的所有列,我了解,如果我们希望将列GROUP BY包含在SELECT子句中,< / p>

我什至试图生成一个GROUP BY的列表,然后对其进行过滤,但同样的情况,它会在整个查询集中进行汇总

id

有人帮助我吗?

注意:我正在使用PostgreSQL数据库

1 个答案:

答案 0 :(得分:0)

最后弄清楚了,我可以在PostgreSQL

中做到这一点
MusicData.objects.order_by('name', '-created_on').distinct('name')..values(
            "age",
            "name",
            "description",
            "url",
            "since_last_pushed",
            "last_updated",
            language=F("language__name"),
        )

这将导致我出现以下查询

SELECT DISTINCT ON ('name', 'created_on')
  id,
  name,
  url,
  description,
  ... etc,
FROM
  musicdata
ORDER BY name ASC,
         created_on DESC;

我想知道这是一个棘手的问题,已经超过2天了,但是这里没有得到任何答复,这让我感到惊讶,我希望在数小时内得到答复,我是否给主题贴错了标签??