Я пишу API на основе Django (2.2.2) и Django Rest Framework (3.9.4).Цель состоит в том, чтобы создать простую систему сообщений.После создания конечной точки для создания сообщения я получаю TypeError:
TypeError at /api/v1/message/create/
__str__ returned non-string (type Message)
The 'message_body' in the DB contains PL characteristic characters.
Я попробовал и serializer.Serializer, и serializer.ModelSerializer для моего сериализатора, CreateAPIView и ListCreateAPIView для представления.Что действительно интересно, конечная точка для вывода сообщений работает нормально.
Это почти код копирования и вставки из другой моей конечной точки (также CreateAPIView), который работает так, как ожидалось.
Я также попробовал кое-что для кодирования на str (self), но не совсем правильно.
sample.json: (приспособления для тестирования API в браузере)
{
"model": "core.message",
"pk": 1,
"fields": {
"chat": 1,
"message_body": "Wiadomość testowa 1",
"sender": "user",
"sent": "2019-05-05T10:20:37+01:00",
"is_viewed": true
}
}
models.py:
class Message(models.Model):
"""
Model representing single message in DB
"""
chat = models.ForeignKey(
'Chat',
on_delete=models.CASCADE,
unique=False
)
message_body = models.TextField(blank=False, null=False)
sender = models.CharField(max_length=4)
sent = models.DateTimeField(auto_now_add=True)
is_viewed = models.BooleanField(default=False)
def __unicode__(self):
return self.message_body
def __str__(self):
return self.message_body.decode('utf8')
views.py:
from rest_framework import generics, status
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from message.serializers import (
ListMessageSerializer,
CreateMessageSerializer
)
from core.models import Message
class CreateMessageView(generics.CreateAPIView):
"""
Create new message view
"""
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
serializer_class = CreateMessageSerializer
def perform_create(self, serializer):
"""
Save data to DB, if valid
"""
if serializer.is_valid():
serializer.save()
else:
return Response(
serializer.errors,
status.HTTP_400_BAD_REQUEST
)
serializers.py
from rest_framework import serializers
from core.models import Chat, Message
class CreateMessageSerializer(serializers.ModelSerializer):
"""
Serializer for creating ne message
"""
class Meta:
model = Message
fields = (
'id',
'chat',
'message_body',
'sender',
'sent',
'is_viewed'
)
read_only_field = ('id',)
def validate(self, attrs):
"""
Validate request data
"""
message_body = attrs.get('message_body')
if not message_body or message_body is None:
msg = _('Can\'t send empty message!')
raise serializers.ValidationError(msg, code='authentication')
return attrs
def create(self, validated_data):
"""
Insert Message into DB
"""
return Message.objects.create(**validated_data)
url.py:
from django.urls import path
from message import views
app_name = 'message'
urlpatterns = [
path('create/', views.CreateMessageView.as_view(), name='create'),
]
Я бы хотел иметь возможность открыть представление в браузере по адресу: api / v1 / message / create / и проверить создание новых сообщений вручную:)