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