I'm using a ModelViewSet with a Model that has a FileField.
When I try to create a model object without the optional file I get the error that
ValueError: Cannot assign "<User: one>": "Page.user" must be a "User" instance.
RROR: test_create_page_endpoint (api.tests.test_pages.PageTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/siecje/Desktop/agora/api/tests/test_pages.py", line 26, in test_create_page_endpoint
response = self.client.post(url, data)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/test.py", line 168, in post
path, data=data, format=format, content_type=content_type, **extra)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/test.py", line 90, in post
return self.generic('POST', path, data, content_type, **extra)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/compat.py", line 222, in generic
return self.request(**r)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/test.py", line 157, in request
return super(APIClient, self).request(**kwargs)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/test.py", line 109, in request
request = super(APIRequestFactory, self).request(**kwargs)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/django/test/client.py", line 466, in request
six.reraise(*exc_info)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 132, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/viewsets.py", line 85, in view
return self.dispatch(request, *args, **kwargs)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/views.py", line 451, in dispatch
response = self.handle_exception(exc)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/views.py", line 448, in dispatch
response = handler(request, *args, **kwargs)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/mixins.py", line 20, in create
self.perform_create(serializer)
File "/home/siecje/Desktop/agora/api/views.py", line 29, in perform_create
serializer.save(stylesheet=self.request.data.get('stylesheet'))
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 165, in save
self.instance = self.create(validated_data)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 775, in create
instance = ModelClass.objects.create(**validated_data)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/django/db/models/manager.py", line 127, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 346, in create
obj = self.model(**kwargs)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/django/db/models/base.py", line 468, in __init__
setattr(self, field.name, rel_obj)
File "/home/siecje/Desktop/agora/venv/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 627, in __set__
self.field.rel.to._meta.object_name,
ValueError: Cannot assign "<User: one>": "Page.user" must be a "User" instance.
class PageTests(APITestCase):
def setUp(self):
self.user = User.objects.create_user(
username='one', email='o...@example.com', password='one')
token = Token.objects.get(user__username=self.user.username)
self.client.credentials(HTTP_AUTHORIZATION='Token ' + token.key)
def test_create_page_endpoint(self):
url = reverse('page-list')
data = {
'name': 'Endpoint Works',
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(response.data['name'], 'Endpoint Works')
class PageSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
class Meta:
model = Page
fields = ('id', 'name', 'stylesheet', 'user', 'created', 'updated')
class User(AuthUser):
class Meta:
proxy = True
class Common(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class Page(Common):
name = models.TextField()
stylesheet = models.FileField(null=True, blank=True)
user = models.ForeignKey(User, related_name='pages')
def __str__(self):
return self.name
class PageViewSet(viewsets.ModelViewSet):
lookup_field = 'id'
parser_classes = (MultiPartParser, FormParser,)
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
queryset = Page.objects.all()
serializer_class = PageSerializer
def perform_create(self, serializer):
serializer.save(stylesheet=self.request.data.get('stylesheet'))
page_list = views.PageViewSet.as_view({
'get': 'list',
'post': 'create'
})
page_detail = views.PageViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
})
url(r'^pages/?$',
page_list,
name='page-list'),
url(r'^pages/(?P<id>[^/]+)/?$',
page_detail,
name='page-detail'),