【问题标题】:Django Rest framework - generic viewDjango Rest 框架 - 通用视图
【发布时间】:2014-05-03 08:32:38
【问题描述】:

我正在学习 Django 和 Django REST 框架。 我正在尝试做 API 并添加查看权限。

从 django.db 导入模型 from 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

序列化程序或视图有问题? 如何解决?

【问题讨论】:

    标签: python django rest


    【解决方案1】:

    当您发送一个 POST 请求来创建您的单词记录时,您正在为该单词的用户属性发送一个列表(以及一个空列表),框架需要一个用户。

    我在您发布的代码中看到了一些内容:

    1. 根据您设置模型的方式,一个 Word 可以有一个用户,但一个用户可以有多个 Word。这是你想要的吗?如果是,那么我认为您不应该在 Word 的序列化程序中指定 many=True。
    2. 是否可以在没有用户的情况下使用 Word?在这种情况下,您可能希望让用户字段允许无。
    3. 您发布的 JSON 是什么样的?要创建一个词(根据我所看到的,这是从我的脑海中想到的),您应该发送如下内容:

      { '值':'testWord' “用户”:1 }

    其中 user 的值是您要与该词关联的用户的主键。

    【讨论】:

    • 谢谢!我误解了“many=True”的参数含义(我删除了它并且所有的工作)。
    猜你喜欢
    • 2014-02-07
    • 2015-08-04
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2022-01-24
    相关资源
    最近更新 更多