У меня есть модель, подобная приведенной ниже,
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
являетсяDateTimeField
in 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
, playlist__name
и т.д ...
, поэтому я следовал этому руководству: https://docs.djangoproject.com/en/2.1/topics/db/aggregation/#combining-multiple-aggregations
Придумал этот запрос,
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")
)
Но, в этом случаеЯ получил дубликаты объектов, затем я проверил SQL-запросы, я выяснил это
В первом случае только GROUP BY name
есть вместе с соединениями, что хорошо
Но во втором случае,GROUP BY
имеет все столбцы, которые я указал в значениях, я понимаю, что если мы хотим, чтобы столбец SELECT
, мы должны включить в GROUP BY
предложение
Я даже попытался создать списокid
s затем фильтруют его, но в том же случае он агрегирует по всему набору запросов
result = models.MusicData.objects.filter(playlist__isnull=True).values(
"name").annotate(maxdate=Max("created_on")).values_list("id", flat=True)
# Then filter on this list of id's
Кто-нибудь мне поможет ???
Примечание: я использую PostgreSQLбазы данных