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