#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')
Комментариев нет:
Отправить комментарий