Объект типа MxCreateSerializer не является сериализуемым в формате JSON

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Я работаю над проектом django, и у меня есть сообщение модели django:

 class Message(models.Model):
    content     = models.TextField(_('Content'))
    sender      = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='sent_dm', verbose_name=_("Sender"),on_delete=models.CASCADE)
    recipient   = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='received_dm', verbose_name=_("Recipient"),on_delete=models.CASCADE)
    sent_at     = models.DateTimeField(_("sent at"), null=True, blank=True)
  

views.py

 class MessageCreateView(APIView):
    queryset = Message.objects.all()
    serializer_class = MxCreateSerializer

    def get(self, request, format=None):
        serializer = MxCreateSerializer()
        return Response({'serializer':serializer})
        
    def post(self, request):
        sent_data   = request.data
        #print(sent_data)
        data_       = [elem for elem in sent_data.values()]
        sender      = data_[0]
        content     = data_[1]
        recipient   = data_[2]
        csrf        = data_[3]
        sender      = get_object_or_404(User,username=sender).username
        recipient   = get_object_or_404(User,username=recipient).username
        new_resp    = {'sender':sender,'content':content,'recipient':recipient, 'csrfmiddlewaretoken':csrf}
        qdict       = QueryDict('', mutable=True)
        qdict.update(new_resp)
        #print(qdict)
        serializer          = MxCreateSerializer(data=qdict)
        if not serializer.is_valid():
            return Response({'message':'no'})
        serializer.save()
        return Response({'message':'yes'})
  

serializers.py

 class MxCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Message
        fields = ['sender','content','recipient']

    def create(self, validated_data):
        message = Message.objects.create(**validated_data)
        print(message)
        return message
  

Я получаю эту ошибку:

Обратная трассировка (последний последний вызов):

 ...
  File "/.../site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/.../site-packages/rest_framework/response.py", line 70, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "/.../site-packages/rest_framework/renderers.py", line 724, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
  File "/.../site-packages/rest_framework/renderers.py", line 680, in get_context
    'content': self.get_content(renderer, data, accepted_media_type, renderer_context),
  File "/.../site-packages/rest_framework/renderers.py", line 413, in get_content
    content = renderer.render(data, accepted_media_type, renderer_context)
  File "/.../site-packages/rest_framework/renderers.py", line 103, in render
    allow_nan=not self.strict, separators=separators
  File "/.../site-packages/rest_framework/utils/json.py", line 25, in dumps
    return json.dumps(*args, **kwargs)
  File "/.../python3.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/.../python3.7/json/encoder.py", line 201, in encode
    chunks = list(chunks)
  File "/.../python3.7/json/encoder.py", line 431, in _iterencode
    yield from _iterencode_dict(o, _current_indent_level)
  File "/.../python3.7/json/encoder.py", line 405, in _iterencode_dict
    yield from chunks
  File "/.../python3.7/json/encoder.py", line 438, in _iterencode
    o = _default(o)
  File "/.../site-packages/rest_framework/utils/encoders.py", line 67, in default
    return super().default(obj)
  File "/.../python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
  

Тип исключения: ошибка типа в /mxcreate/

Значение исключения: Объект типа MxCreateSerializer не сериализуем в формате JSON


Спасибо за любые предложения

Ответ №1:

Данные сериализатора в ответ должны быть отправлены следующим образом

 def get(self, request, format=None):
    serializer = MxCreateSerializer()
    return Response({'serializer':serializer.data})
  

Примечание: .data с сериализатором

Комментарии:

1. В ошибке говорилось, что он ожидал senders.pk и не его имя пользователя, но теперь я получаю сбой УНИКАЛЬНОГО ограничения: webdata_message.sender_id

2. Проверьте перед отправкой данных в ваш метод создания. Если идентификатор уже существует, вам следует обновить данные вместо этого при создании.