Django Rest Framework как сгруппировать по дате и вернуть модель - PullRequest
0 голосов
/ 18 января 2020

Я использую фильтры 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: [...]},
]

Как эффективно возвращать подобные результаты, чтобы мне не приходилось манипулировать обычным набором запросов на внешнем интерфейсе?

...