Django Rest框架 - 通用视图
我正在学习Django和Django REST框架。
我想做一个API,并添加权限来查看。
从django.db导入模型
从django.contrib.auth.models导入用户
我的模型:
class Profile(models.Model):
nickname = models.CharField(max_length=100)
# Relations
user = models.OneToOneField(User)
class Word(models.Model):
value = models.CharField(max_length=100)
user = models.ForeignKey(User, related_name='word')
我的序列化器:
from rest_framework import serializers
from myapp.models import Profile, Word
from django.contrib.auth.models import User
class ProfileSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField()
class Meta:
model = Profile
fields = ('id', 'nickname', 'user')
class UserSerializer(serializers.ModelSerializer):
profile = serializers.PrimaryKeyRelatedField()
class Meta:
model = User
fields = ('id', 'username', 'profile')
class WordSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(many=True)
class Meta:
model = Word
fields = ('id', 'value', 'user')
我的视图:
class WordList(generics.ListCreateAPIView):
queryset = Word.objects.all()
serializer_class = WordSerializer
class WordDetail(generics.RetrieveUpdateAPIView):
queryset = Word.objects.all()
serializer_class = WordSerializer
当我尝试添加一个新的“单词”时 - 显示错误:
Cannot assign "[]": "Word.user" must be a "User" instance.
Request Method: POST
Request URL: http://127.0.0.1:8080/api/words/
Django Version: 1.6.2
Exception Type: ValueError
Exception Value:
Cannot assign "[]": "Word.user" must be a "User" instance.
Exception Location: /home/mikhail/virtualenv/test/lib/python3.3/site-packages/django/db/models/fields/related.py in __set__, line 337
Python Executable: /home/mikhail/virtualenv/test/bin/python3.3
Python Version: 3.3.5
Python Path:
['/home/mikhail/virtualenv/test/bin/mysite',
'/home/mikhail/virtualenv/test/lib/python3.3/site-packages/MySQL_python-1.2.3-py3.3-linux-x86_64.egg',
'/home/mikhail/virtualenv/test/lib/python3.3',
'/home/mikhail/virtualenv/test/lib/python3.3/plat-linux',
'/home/mikhail/virtualenv/test/lib/python3.3/lib-dynload',
'/usr/lib/python3.3',
'/usr/lib/python3.3/plat-linux',
'/home/mikhail/virtualenv/test/lib/python3.3/site-p
问题出在序列化器还是视图?
怎么解决?
1 个回答
1
当你发送一个POST请求来创建你的单词记录时,你实际上是给单词的用户属性发送了一个列表(而且这个列表是空的),但框架其实是期待一个用户对象。
我看到你发布的代码中有几个问题:
- 根据你设置的模型,一个单词只能有一个用户,但一个用户可以有多个单词。你是这样设计的吗?如果是的话,我觉得在单词的序列化器里不应该设置many=True。
- 单词可以没有用户吗?如果可以的话,你可能需要让用户字段允许为空。
你发送的JSON数据是什么样的?为了创建一个单词(这是我根据看到的内容随便想的),你应该发送类似这样的内容:
{ 'value': 'testWord', 'user': 1 }
这里,用户的值是你想要关联的用户的主键。