#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. Проверьте перед отправкой данных в ваш метод создания. Если идентификатор уже существует, вам следует обновить данные вместо этого при создании.