Как получить данные сериализатора перед ответом в 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