Python Django Rest Framework单元测试值错误:无法分配;u';约翰兹'&引用;:&引用;消息。作者“;必须是一个";“用户”;实例

Python Django Rest Framework单元测试值错误:无法分配;u';约翰兹'&引用;:&引用;消息。作者“;必须是一个";“用户”;实例,python,django,unit-testing,django-rest-framework,Python,Django,Unit Testing,Django Rest Framework,tests.py from django.contrib.auth.models import User from django.core.urlresolvers import reverse from rest_framework import status from rest_framework.test import APITestCase, APIClient, RequestsClient, APIRequestFactory from rest_framework.authtoke

tests.py

from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from rest_framework import status
from rest_framework.test import APITestCase, APIClient, RequestsClient, APIRequestFactory
from rest_framework.authtoken.models import Token
from views import MessageListView


class CreateMessageTest(APITestCase):
    def setUp(self):
        self.client = APIRequestFactory()
        self.user = User.objects.create_user(username='johnz', first_name='John', last_name='Doe', email='john@doe.com', password='johnny', id=3)
        self.user.save()
        self.token = Token.objects.create(user=self.user)
        self.data = {"body": "I am sad", "author": self.user}

    def test_loggedin_user_can_create_message(self):
        header = {'HTTP_AUTHORIZATION': 'Token {}'.format(self.token)}
        user_obj = User.objects.get(pk=self.user.pk)
        request = self.client.post(reverse('message-list'), data=self.data, **header)
        response = MessageListView.as_view()(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

    def test_anonymous_cant_create_message(self):
        request = self.client.post(reverse('message-list'), data=self.data)
        response = MessageListView.as_view()(request)

        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
回溯

Traceback (most recent call last):
  File "/home/bkovacev/PycharmProjects/silver_logic_project/posts/tests.py", line 28, in test_loggedin_user_can_create_message
    response = MessageListView.as_view()(request)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/rest_framework/views.py", line 477, in dispatch
    response = self.handle_exception(exc)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/rest_framework/views.py", line 437, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/rest_framework/views.py", line 474, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/rest_framework/generics.py", line 243, in post
    return self.create(request, *args, **kwargs)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/rest_framework/mixins.py", line 21, in create
    self.perform_create(serializer)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/rest_framework/mixins.py", line 26, in perform_create
    serializer.save()
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 214, in save
    self.instance = self.create(validated_data)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 902, in create
    instance = ModelClass.objects.create(**validated_data)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/django/db/models/query.py", line 397, in create
    obj = self.model(**kwargs)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/django/db/models/base.py", line 537, in __init__
    setattr(self, field.name, rel_obj)
  File "/home/bkovacev/envs/silver_logic_project_env/local/lib/python2.7/site-packages/django/db/models/fields/related_descriptors.py", line 211, in __set__
    self.field.remote_field.model._meta.object_name,
ValueError: Cannot assign "u'johnz'": "Message.author" must be a "User" instance.
我读过与此类似的其他文章,检查了我是否引用了正确的用户模型,我尝试了很多方法,但都没有成功

我做错了什么?如果我将
format='json'
添加到
self.client.post()
中,我得到的
不是可序列化的json
。所以我不确定我做错了什么

编辑:

添加了
models.py

from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
from django.contrib.postgres.fields import JSONField


class Message(models.Model):
    """

    """
    author = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='messages'
    )
    created_at = models.DateTimeField(auto_now_add=True)
    body = models.TextField(max_length=160)
    sentiment = JSONField(blank=True, null=True)

    def __str__(self):
        return "%s, %s, %s" % (self.author, self.created_at, self.id)
class MessageSerializer(serializers.HyperlinkedModelSerializer):

    author = UserSerializer()

    class Meta:
        model = Message
        fields = ('author', 'sentiment', 'created_at', 'body', 'url')
class MessageListView(generics.ListCreateAPIView):
    """
    Class Based View that lists/creates Silver Logic(s)
    """
    queryset = Message.objects.all()
    serializer_class = MessageSerializer
    permission_classes = (IsAuthenticatedOrReadOnly, )
    pagination_class = PageNumberPagination
编辑2(添加了序列化程序和视图) 编辑3(调整序列化程序)
serializers.py

from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
from django.contrib.postgres.fields import JSONField


class Message(models.Model):
    """

    """
    author = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='messages'
    )
    created_at = models.DateTimeField(auto_now_add=True)
    body = models.TextField(max_length=160)
    sentiment = JSONField(blank=True, null=True)

    def __str__(self):
        return "%s, %s, %s" % (self.author, self.created_at, self.id)
class MessageSerializer(serializers.HyperlinkedModelSerializer):

    author = UserSerializer()

    class Meta:
        model = Message
        fields = ('author', 'sentiment', 'created_at', 'body', 'url')
class MessageListView(generics.ListCreateAPIView):
    """
    Class Based View that lists/creates Silver Logic(s)
    """
    queryset = Message.objects.all()
    serializer_class = MessageSerializer
    permission_classes = (IsAuthenticatedOrReadOnly, )
    pagination_class = PageNumberPagination
views.py

from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
from django.contrib.postgres.fields import JSONField


class Message(models.Model):
    """

    """
    author = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='messages'
    )
    created_at = models.DateTimeField(auto_now_add=True)
    body = models.TextField(max_length=160)
    sentiment = JSONField(blank=True, null=True)

    def __str__(self):
        return "%s, %s, %s" % (self.author, self.created_at, self.id)
class MessageSerializer(serializers.HyperlinkedModelSerializer):

    author = UserSerializer()

    class Meta:
        model = Message
        fields = ('author', 'sentiment', 'created_at', 'body', 'url')
class MessageListView(generics.ListCreateAPIView):
    """
    Class Based View that lists/creates Silver Logic(s)
    """
    queryset = Message.objects.all()
    serializer_class = MessageSerializer
    permission_classes = (IsAuthenticatedOrReadOnly, )
    pagination_class = PageNumberPagination

事实上,模型中的作者引用了一个对象用户。当你添加

author = serializers.CharField()

它返回一个字符串

请发布您的
消息
模型,好吗?@themanatuf Hi,编辑以包含模型您需要显示视图和序列化程序。
作者
是外键,那么您为什么要将其定义为序列化程序上的CharField?@DanielRoseman Hi,我已经包含了它们,并立即注意到我的错误。我将字段更改为UserSerializer。然而,我仍然得到一个错误(400),您是正确的-我将其更改为UserSerializer,现在有一个400错误。有什么特别的原因吗?试着删除你刚刚更改的行。。它不需要有UserSerializer()。。删除这行就行了