Django Rest Framework-可写的嵌套序列化程序上下文

时间:2018-08-09 10:49:37

标签: django django-rest-framework

所以我有一个模型层次结构,所有这些模型都将使用父级序列化程序创建。对于孙子验证,我需要兄弟的信息。
问题是嵌套层次结构中的最后一个序列化器将首先被验证,因此我将无法将兄弟信息传递给孙子序列化器。

我正在寻找一种方法来更改验证序列化器的顺序,或者将其他序列化器的数据传递给孙子序列化器

模型和serialzier如下所示:

class Parent(TimeStampedModel):
    child = models.OneToOneField('app.Child', related_name='parent')
    brother = models.OneToOneField('app.Brother', related_name='parent')

class Child(TimeStampedModel):
    grandchild = models.OneToOneField('app.GrandChild', related_name='dad')

class ParentSerializer(serializer.ModelSerializer):
    name = serializer.CharField(max_length=10, allow_null=False)
    child = ChildSerializer(required=False, allow_null=True)
    brother = BrotherSerializer(required=False, allow_null=True)

class ChildSerializer(serializers.ModelSerializer):
    name = serializer.CharField(max_length=10, allow_null=False)
    grandchild = GrandchildSerializer(required=False, allow_null=True)

到目前为止,我已经尝试了一些方法,并且有2项有效:
  -使用self.parent.data或self.parent.parent.data从嵌套的序列化器访问父级序列化器的数据。
  -在视图中,弹出嵌套模型的数据,然后手动实例化序列化器并创建它们,如下所示:

 grandchild_data = request.data['child'].pop('grandchild', None)
 brother_data = request.data.pop('brother', None)
 serializer_context = super(view, self).get_serializer_context()
 serializer_context.update({'brother': brother_data})

 grandchild_serializer = GrandchildSerializer(data=grandchild_data, context=serializer_context)
 grandchild_serializer.is_valid(raise_exception=True)
 grandchild_serializer.save()

尽管最后一种方法有效,但重写drf代码似乎是错误的,因此验证视图中的内容也是如此。
还有其他方法吗?

0 个答案:

没有答案