我有一个类似下面的模型,
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_on
(created_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_on
,name
,url
,age
,count
等
所以我遵循了本指南: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数据库
答案 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天了,但是这里没有得到任何答复,这让我感到惊讶,我希望在数小时内得到答复,我是否给主题贴错了标签??