Доступ к другому сериализатору, если набор запросов пуст Django Rest Framework

Я не думаю, что реализую это правильно, но я пытаюсь изменить сериализатор, используемый для набора запросов, на основе условия (если в одном наборе запросов нет объектов, переключиться на другой сериализатор и просто вернуть объект списка). Я не совсем уверен, как это сделать.

Вот вид

class SavedVenuesViewSet(viewsets.ModelViewSet):
    serializer_class = UserVenueSerializer
    
    def get_queryset(self):
        list_id = self.request.GET.get('list_id', None)
        user = self.request.user.id
        print(user)
        print(list_id)
        print(type(list_id))
        qs = UserVenue.objects.filter(user_list=int(float(list_id)))
        if not qs:    
            print("EMPTY LIST") #this is where i try to switch serializer
            serializer_class = UserListSerializer
            return UserVenue.objects.filter(id=int(float(list_id)))
        else:
            return qs

Вот соответствующие сериализаторы:

class UserVenueSerializer(serializers.ModelSerializer):
    venue = mapCafesSerializer()
    
    class Meta:
        model = UserVenue
        fields = ['user', 'user_list', 'venue']
        depth = 2 

[...]

class UserListSerializer(serializers.ModelSerializer): 
    class Meta:
        model = UserList
        fields = ['id', 'user', 'list_name']
        depth = 2

Трассировка не приводит к ошибке, но она не делает того, на что я надеюсь:

1
45
<class 'str'>
EMPTY LIST
[29/Sep/2021 11:05:36] "GET /api/savedvenues/?list_id=45 HTTP/1.1" 200 2

Вы можете удалить поле serializer_class из представления, и создать метод get_serializer_class(), который будет содержать логику выбора сериализатора. Это лучшая практика.

Но вы также можете сделать это в своем get queryset.

Сначала удалите атрибут serializer_class из вашего представления. Вместо этого установите его внутри метода get_queryset (с помощью this.serializer_class);

def get_queryset(self):
    list_id = self.request.GET.get('list_id', None)
    qs = UserVenue.objects.filter(user_list=int(float(list_id)))
    if not qs:
        this.serializer_class = UserVenueSerializer  
        return UserVenue.objects.filter(id=int(float(list_id)))
    else:
        this.serializer_class = UserListSerializer
        return qs

Не забудьте использовать класс this.serializer_class.

Это правильная практика изменения класса serializer в ModelViewSet:

Вы должны переопределить get_serializesr_class метод:

class SavedVenuesViewSet(viewsets.ModelViewSet):
    serializer_class = UserVenueSerializer
    
    def get_serializer_class(self):
        if not self.get_queryset():  # Check your conditions here
            return UserListSerializer
        else:
            return UserVenueSerializer
Вернуться на верх