Как получить данные сериализатора перед ответом в DRF ListAPIView, чтобы упорядочить их по всем полям?

У меня есть две модели.

class Team(models.Model):
    user = models.ManyToManyField(User, related_name='%(class)s_user')
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='%(class)s_company')
    is_active = models.BooleanField(default=True)
    has_user = models.BooleanField(default=False)

    class Meta:
        app_label = 'accounts'


class TeamTranslation(models.Model):
    team_name = models.CharField(max_length=100)
    team_description = models.TextField()
    team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='%(class)s_team')
    languages = models.ForeignKey(Languages, on_delete=models.CASCADE, related_name='%(class)s_languages')
    is_active = models.BooleanField(default=True)

Это представление списка...

class teamListView(generics.ListAPIView):
search_fields = ['teamtranslation_team__team_name']
filter_backends = (filters.SearchFilter,)
serializer_class = teamSerializer
pagination_class = StandardResultsSetPagination

def get_queryset(self):
    accessor_id = self.request.user.id
    queryset = Team.objects.filter(is_active=True).order_by("id")
    return queryset

def post(self, request, *args, **kwargs):
    return self.list(request, *args, **kwargs)

def get_serializer_context(self):
    lang_id = UserProfile.objects.get(user_id=self.request.user.id).languages_id
    return {"lang_id": lang_id}

А это сериализатор...

class teamSerializer(serializers.ModelSerializer):
team_id = serializers.IntegerField(source='id')
members_count = serializers.SerializerMethodField()
team_description = serializers.SerializerMethodField()
team_name = serializers.SerializerMethodField()
company_code = serializers.CharField(source='company.company_code')

def get_team_description(self, obj):
    lang_id = self.context.get('lang_id')
    if TeamTranslation.objects.filter(team_id=obj.id, languages_id=lang_id, is_active=True):
        return f'{TeamTranslation.objects.get(team_id=obj.id, languages_id=lang_id, is_active=True).team_description}'
    return f'{""}'

def get_team_name(self, obj):
    lang_id = self.context.get('lang_id')
    if TeamTranslation.objects.filter(team_id=obj.id, languages_id=lang_id, is_active=True):
        return f'{TeamTranslation.objects.get(team_id=obj.id, languages_id=lang_id, is_active=True).team_name}'
    return f'{""}'

def get_members_count(self, obj):
    return len(obj.user.values_list('id', flat=True))


class Meta:
    model = Team
    fields = ("team_id", "team_name", "team_description", 'members_count', 'company_id', 'company_code', 'has_user')

Я пытаюсь упорядочить данные в соответствии с параметром запроса, приходящим из запроса. Поэтому нет никаких проблем при использовании условия order_by для полей модели Team. Проблема начинается, когда я пытаюсь упорядочить поля TeamTranslation. Я хочу упорядочить данные сериализатора до того, как ListAPIView ответит на них. Есть ли способ сделать это?

Я пытаюсь использовать для этого, например, предложение order_by. queryset = queryset.order_by("teamtranslation_team__team_name")

или для обратного я использую знак -. Это работает, но я хочу, чтобы параметр запроса приходил с именем поля, которое я описываю в полях сериализатора. Из-за этого я думаю, что лучшим способом может быть упорядочивание данных в данных сериализатора, но я не могу достичь этого. Упорядочение данных по количеству членов также является другой проблемой. Спасибо за помощь.

Вы можете рассмотреть OrderingFilter, который позволяет упорядочить набор запросов. Например, так:

class teamListView(generics.ListAPIView):
    search_fields = ['teamtranslation_team__team_name']
    ordering_fields = ['id', 'teamtranslation_team__team_name']
    ordering = ['id']
    filter_backends = (filters.SearchFilter,filters.OrderingFilter)
    serializer_class = teamSerializer
    pagination_class = StandardResultsSetPagination
    queryset = Team.objects.filter(is_active=True)
    # no need to override get_queryset method
Вернуться на верх