Доступ к другому сериализатору, если набор запросов пуст 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