DjangoRest嵌套序列化OneToOn

2024-09-29 17:09:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在寻找并跟踪Django Rest的官方文档here,并试图以此为基础建立我的方法,但我使用的是一对一的关系。在

但是,当我在browsable接口中添加时,它不会在嵌套的文本字段中获取值,并告诉我它不能为null。我试着在这里搜索,但是找不到任何能让一段感情像我想要的那样工作的东西。我是REST框架的新手,我真的很困惑。谢谢!在

基本上,每个动词都需要有一个过去时宾语,它有这三个字段(为了测试,更多,甚至是另一层嵌套,稍后会添加)。我只是不能让他们用可浏览的API添加。在

在模型.py公司名称:

from django.db import models

class Verb(models.Model):
    verb = models.TextField()
    verbal_noun = models.TextField()
    verbal_adjective = models.TextField()
    present = models.TextField()
    future = models.TextField()
    habitual_present = models.TextField()
    conditional = models.TextField()
    past_habitual = models.TextField()
    past_subjunctive = models.TextField()
    present_subjunctive = models.TextField()
    imperative = models.TextField()

class Past(models.Model):
    verb = models.OneToOneField(Verb)
    first_singular = models.TextField()
    second_singular = models.TextField()
    third_singular = models.TextField()

在序列化程序.py公司名称:

^{pr2}$

原始数据输入:

{
    "verb": "test",
    "verbal_noun": "test",
    "verbal_adjective": "test",
    "past": {
        "first_singular": "test1",
        "second_singular": "test2",
        "third_singular": "test3"
    },
    "present": "test",
    "future": "test",
    "habitual_present": "test",
    "conditional": "test",
    "past_habitual": "test",
    "past_subjunctive": "test",
    "present_subjunctive": "test",
    "imperative": "test"
}

在视图.py在

from conjugations.models import Verb
from conjugations.serializers import VerbSerializer
from rest_framework import generics, permissions

class VerbList(generics.ListCreateAPIView):
    queryset = Verb.objects.all()
    serializer_class = VerbSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

class VerbDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Verb.objects.all()
    serializer_class = VerbSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

在网址.py在

from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from conjugations import views

urlpatterns = [
    url(r'^verbs/$', views.VerbList.as_view()),
    url(r'^verbs/(?P<pk>[0-9]+)/$', views.VerbDetail.as_view()),
]

urlpatterns = format_suffix_patterns(urlpatterns)

错误:

File "/home/Projects/Python/virtualenvs/remnigh/lib/python3.5/site-packages/rest_framework/mixins.py", line 26, in perform_create
    serializer.save()
  File "/home/Projects/Python/virtualenvs/remnigh/lib/python3.5/site-packages/rest_framework/serializers.py", line 191, in save
    self.instance = self.create(validated_data)
  File "/home/Projects/Python/reimnigh-test/reimnigh/conjugations/serializers.py", line 19, in create
    past_data = validated_data.pop('past')
KeyError: 'past'

Tags: frompytestimportmodelsclasstextfieldpast
3条回答

尝试将VerbSerializer中的past字段改为:

past = PastSerializer(source='past_set')

如果过去的动词关系是一个外键,则可以使用这种语法-我不能确定它是否适用,但DRF文档指出,要嵌套反向关系,必须指定相关名称,如上所述或在模型定义中指定。在

如果这不起作用,你能公布准确的错误/回溯吗?在

请确保您的请求以json内容类型执行。HTML表单不支持嵌套序列化程序。在

我的py序列化程序有点乱。我需要删除past_datafor循环,因为它是一对一的,只需直接映射。更正以下文件:

from rest_framework import serializers
from conjugations.models import Verb, Past

class PastSerializer(serializers.ModelSerializer):
    class Meta:
        model = Past
        fields = ('first_singular','second_singular','third_singular')

class VerbSerializer(serializers.ModelSerializer):
    past = PastSerializer()

    class Meta:
        model = Verb
        fields = ('verb','verbal_noun','verbal_adjective','past','present',
                'future','habitual_present','conditional','past_habitual',
                'past_subjunctive','present_subjunctive','imperative')

    def create(self, validated_data):
        past_data = validated_data.pop('past')
        verb = Verb.objects.create(**validated_data)
        Past.objects.create(verb=verb, **past_data)
        return verb

它也有助于确保您的迁移也是最新的。这可能和这有点关系。在

相关问题 更多 >

    热门问题