DRF создает экземпляр с вложенным сериализатором, вызывая исключение на serializer.is_valid
Контекстуализация
У меня есть следующий сериализатор, который имеет вложенный сериализатор для возврата имени пользователя вместо id
class RoomSerializer(serializers.ModelSerializer):
participants = ParticipantSerializer(many=True) # Nested serializer
class Meta:
model = Room
fields = '__all__'
I crated the following ListView under this url => `localhost:8000/api/rooms/<username>/`
class RoomList(generics.ListCreateAPIView):
serializer_class = RoomSerializer
def get_queryset(self):
return Room.objects.filter(participants__username=self.kwargs['username'])
def create(self, request, *args, **kwargs):
print(request.data)
return super().create(request, *args, **kwargs)
Первый выпуск
Первое, что произошло - я отправил следующие данные
data = {
'participants': ['foo', 'foo1']
}
и вернул ошибку 400 со следующими данными
{"participants": [
{"non_field_errors": ["Invalid data. Expected a dictionary, but got str."]},
{"non_field_errors": ["Invalid data. Expected a dictionary, but got str."]}
]
}
Поэтому я изменил данные запроса, чтобы выглядели как полезная нагрузка, когда я делаю запрос get к этой конечной точке.
data = {
'participants': [
{username: 'foo'},
{username: 'foo2'},
]
}
Второй вопрос
По-прежнему возвращается код 400 с этим ответом.
{"participants": [
{"username": ["A user with that username already exists."]},
{"username": ["A user with that username already exists."]}
]
}
что мне нужно
На 'GET' мне нужен список всех комнат, участником которых является пользователь, и каждая комната должна иметь список с именем пользователя (здесь необходим вложенный сериализатор, потому что без него список составлялся по id)
В 'POST' мне нужно создать новую комнату, единственное поле, которое требуется, это участник, для этого поста я помещу модель комнаты ниже.
class Room(models.Model):
room_name = models.CharField(max_length=28, blank=True, null=True)
participants = models.ManyToManyField(CustomUser)
messages = models.ManyToManyField(Message, blank=True)
is_group = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return str(self.pk)