Я использую фильтры DRF и django, чтобы вернуть список турниров. Это должно работать с календарем на внешнем интерфейсе, поэтому я хочу сгруппировать по полю даты и вернуть исходный объект. Мой взгляд:
class TournamentDayCountViewSet(viewsets.ModelViewSet):
queryset = Tournament.objects.all()
serializer_class = TournamentCalendarSerializer
# permission_classes = [permissions.IsAuthenticated]
distance_filter_field = "latlng"
filter_backends = (DjangoFilterBackend, DistanceToPointFilter, OrderingFilter)
filterset_class = TournamentDayCountFilter
class TournamentDayCountFilter(TournamentFilter):
def filter_queryset(self, queryset):
return (
queryset.annotate(
start_date=Trunc("time_stamp", "day", output_field=DateTimeField())
)
.values("start_date")
.annotate(tournament_count=Count("id")).order_by()
)
и сериализатор
"""Serialize calendar info only pertinent to displaying count for speed, pagination is very high"""
tournament_count = serializers.IntegerField()
start_date = serializers.DateTimeField()
class Meta:
fields = ("tournament_count", "start_date")
В настоящее время это возвращает результаты, такие как
{
"tournament_count": 1,
"start_date": "2019-01-12T00:00:00Z"
},
{
"tournament_count": 2,
"start_date": "2020-01-18T00:00:00Z"
},
Я подозреваю, что я должен сделать что-то вроде
results = defaultdict(list)
qs = queryset.annotate(
start_date=Trunc("time_stamp", "day", output_field=DateTimeField())
).annotate(tournament_count=Count("id")).order_by('start_date')
for tourney in qs:
results[tourney.start_date].append(tourney)
return list(results)
Но в настоящее время это не работает. Я хотел бы получить следующие результаты:
[
{'2020/01/10': [{'count': 1, tournaments: [...]},
{'2020/01/11': [{'count': 2, tournaments: [...]},
]
Как эффективно возвращать подобные результаты, чтобы мне не приходилось манипулировать обычным набором запросов на внешнем интерфейсе?