Django Rest框架 - 通用视图

1 投票
1 回答
1449 浏览
提问于 2025-04-17 23:49

我正在学习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请求来创建你的单词记录时,你实际上是给单词的用户属性发送了一个列表(而且这个列表是空的),但框架其实是期待一个用户对象。

我看到你发布的代码中有几个问题:

  1. 根据你设置的模型,一个单词只能有一个用户,但一个用户可以有多个单词。你是这样设计的吗?如果是的话,我觉得在单词的序列化器里不应该设置many=True。
  2. 单词可以没有用户吗?如果可以的话,你可能需要让用户字段允许为空。
  3. 你发送的JSON数据是什么样的?为了创建一个单词(这是我根据看到的内容随便想的),你应该发送类似这样的内容:

    { 'value': 'testWord', 'user': 1 }

这里,用户的值是你想要关联的用户的主键。

撰写回答