Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

group by и annotate в django

#orm #django


Привет всем. Поискав, узнал что group_by нету в django, удивило, почему? Нашел, то
что можно подобное сделать через annotate. Написал через annotate, но он выводит лишнее
поле. Вообще задача состоит вот в чем, есть модель.
class Schedule(models.Model):
    id_schedule = models.AutoField(primary_key = True)
    date = models.DateField(editable = False,verbose_name=u'дата')

Пример данных, которые хранятся в ней:
1 | 2012-05-28
2 | 2012-05-28
3 | 2012-05-19
4 | 2012-05-19
5 | 2012-05-19
6 | 2012-05-26

В итоге мне нужно получить:
5 | 2012-05-19
6 | 2012-05-26
2 | 2012-05-28

Я написал запрос
schedules =  Schedule.objects.filter(date__gte = date).order_by('date', '-      
id_schedule').annotate(Count('date'))

но в запросе есть почему то
GROUP BY "schedule_schedule"."id _ schedule",
Почему такое происходит? Как сделать правильно?     


Ответы

Ответ 1



Вам надо использовать values(), потому что orm по умолчанию будет всегда включать id, соответственно ни distinct, ни GROUP BY работать не будут. schedules = Schedule.objects.values('date').filter(date__gte=date). order_by('date').annotate(count=Count('date')) UPDATE Если нужны последние id'шники, то можно получить их функцией max() т.е. получится что-то вроде schedules = Schedule.objects.filter(date__gte=date).order_by('date') .annotate(id=Max('id'), count=Count('date')) если я ничего не перепутал.

Ответ 2



Привет, а то что нужно получить разве не distinct'ом делается обычно? schedules = Schedule.objects.filter(date__gte = date).order_by('date', '- id_schedule').distinct('date') вот дока https://docs.djangoproject.com/en/1.4/ref/models/querysets/#distinct

Ответ 3



GROUP BY есть Вам нужен DISTINCT, смотрите примеры, там есть именно пример для вашего случая: Entry.objects.order_by('author', 'pub_date').distinct('author')

Комментариев нет:

Отправить комментарий