Мне нужно сгруппировать результат запроса по дате в DRF
""" Django model """
class Matches(models.Model):
name = models.CharField(max_length=100)
platform = models.CharField(max_length=100)
mode = models.CharField(max_length=100)
kills = models.IntegerField()
date = models.DateTimeField()
""" Serializer """
class MatchesSerializer(serializers.ModelSerializer):
class Meta:
model = models.Matches
fields = ('name', 'platform', 'mode', 'kills', 'date')
""" views """
class Matches(generics.ListAPIView):
serializer_class = serializers.MatchesSerializer
filter_backends = (filters.OrderingFilter,)
lookup_field = 'name'
ordering = ('-date',)
def get_queryset(self):
username = self.kwargs['name']
return models.Matches.objects.filter(name=username)
Желаемый результат (просто пример):
[
{
'date':'2019-01-01',
'data':[
{
'platform':'ps4',
'mode':'solo',
'kills':10,
'date':'2019-01-01 10:00:00'
},
{
'platform':'ps4',
'mode':'duo',
'kills':10,
'date':'2019-01-01 12:00:00'
},
{
'platform':'ps4',
'mode':'squad',
'kills':10,
'date':'2019-01-01 11:00:00'
},
]
},
{
'date':'2019-01-02',
'data':[
{
'platform':'ps4',
'mode':'solo',
'kills':1,
'date':'2019-01-02 10:00:00'
},
{
'platform':'ps4',
'mode':'duo',
'kills':2,
'date':'2019-01-02 12:00:00'
},
{
'platform':'ps4',
'mode':'squad',
'kills':3,
'date':'2019-01-02 11:00:00'
},
]
}
]
Для меня простое решение - сделать необработанный запрос на django и создать сериализатор, но это не так питонично...
Итак, похоже, что у DRF есть прекрасный способ сделать его красивым, возможно, с помощью to_representation...
добавлен текущий класс просмотра, который показывает только список совпадений, а не сгруппированных
Ваш ответ может быть в эта почта
Вы проверили и попробовали stackoverflow.com/questions/31071702/…
оба комментария, кажется, отвечают на мой вопрос! Может ли кто-нибудь из вас дать ответ, чтобы я мог принять?
Вы можете использовать функцию raw из Django ORM.
results = Matches.objects.raw('SELECT * FROM myapp_matches GROUP BY date')
Я использовал итератор itertools.groupby. Проверьте мой код ниже.
from itertools import groupby
events = [["2020-04-01", "A"], ["2020-04-01", "B"], ["2020-04-02", "C"], ["2020-04-02", "D"]]
for k, g in groupby(events, lambda x: x[0]):
list = []
for group in g:
list.append(group[1])
output[k] = list
Вывод будет сгруппирован по дате следующим образом
{'2020-04-01': ['A', 'B'], '2020-04-02': ['C', 'D']}
Пожалуйста, убедитесь, что ваш заказ по дате в первую очередь.
Можешь показать нам свой
views.py
? Это может быть там, где вы должны изменить и аннотировать/агрегировать свои элементы.