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()。。删除这行就行了