Python Django Rest嵌套序列化OneToOne

Python Django Rest嵌套序列化OneToOne,python,django,django-rest-framework,Python,Django,Django Rest Framework,我一直在寻找并遵循Django Rest官方文档,并试图将我的方法建立在这些文档的基础上,但我使用的是OneToOne关系 但是,当我在可浏览界面中添加时,它不会在嵌套的文本字段中拾取值,并告诉我它不能为null。我在这里尝试过谷歌搜索,但找不到任何能让一对一的关系像我想要的那样运作的东西。我是REST框架的新手,我真的很困惑。谢谢 基本上,每个动词都需要有一个过去时宾语,它有这三个字段(为了测试,后面将添加更多,甚至另一层嵌套)。我只是无法让他们添加可浏览的API Models.py: fro

我一直在寻找并遵循Django Rest官方文档,并试图将我的方法建立在这些文档的基础上,但我使用的是OneToOne关系

但是,当我在可浏览界面中添加时,它不会在嵌套的文本字段中拾取值,并告诉我它不能为null。我在这里尝试过谷歌搜索,但找不到任何能让一对一的关系像我想要的那样运作的东西。我是REST框架的新手,我真的很困惑。谢谢

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

Models.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()
Serializers.py:

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)
        for past in past_data:
            Past.objects.create(verb=verb, **past)
        return verb
原始数据输入:

{
    "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"
}
Views.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,)
url.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)

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

请尝试将
VerbSerializer
中的
过去
字段更改为:

past = PastSerializer(source='past_set')
如果过去的动词关系是外键,则可以使用这种语法-我不能确定它是否适用于您,但DRF文档说明,要嵌套反向关系,必须指定相关名称,如上所述或在模型定义中


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

我的serializers.py有点混乱。我需要删除
for
for
pass_data
循环,因为它是一对一的,只是直接映射而已。更正文件如下:

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

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

我这样做了,它通过了我得到的空错误。但是,我现在在尝试执行
validated\u data.pop('pass')
时,create()方法中出现了一个错误。它说有一个
键错误:'pass'
,所以我不确定为什么数据没有通过。我正在按照@Linovia所说的做,不使用HTML表单,而是使用原始数据,并尝试使用Django shell。好的,很高兴这至少有点帮助。你能发布完整的回溯和关于实际URL+负载的更多信息吗?我假设您正在发布到端点,并使用自定义的
create()
来处理嵌套。是的,这正是我要做的。我从框架文档中提取了自定义的
create()
,但它设置为适用于OneToMany,所以我想知道这是否是问题所在。我已经用错误日志编辑了我的原始文章,直到它失败的地方,创建,以及我的原始数据输入是什么,views.py和url.py。大多数都是在框架的官方教程中模仿的。哦,我应该补充一点,如果我在shell中手动添加数据,然后执行
data.pop('pass')
,它工作得非常好(尽管它不会发布)。所以我想知道它是否与
验证的数据有关?这就是我现在的想法-您是否通过
是否有效()
创建()方法进行了调试?我的情况与你的非常相似,我的
validated\u data.pop('pass')
也很好。我很想知道验证器是否以某种方式删除了
过去的
数据,这可能是
键错误
的来源。在出现错误之前,输入一份
validated\u数据的打印,看看它包含了什么,谢谢!我不知道表格做不到。但是,从我对@dkhaupt的评论中可以看出,仍然存在一些问题。
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