CreateAPIView возвращает TypeError с функцией st () при доступе к конечной точке через браузер - PullRequest
0 голосов
/ 30 июня 2019

Я пишу 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 / и проверить создание новых сообщений вручную:)

1 Ответ

0 голосов
/ 01 июля 2019

Я удалил связь между PrimaryKeys: Чат - родитель сообщения в БД

Теперь все работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...