所以我有一个模型层次结构,所有这些模型都将使用父级序列化程序创建。对于孙子验证,我需要兄弟的信息。
问题是嵌套层次结构中的最后一个序列化器将首先被验证,因此我将无法将兄弟信息传递给孙子序列化器。
我正在寻找一种方法来更改验证序列化器的顺序,或者将其他序列化器的数据传递给孙子序列化器
模型和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代码似乎是错误的,因此验证视图中的内容也是如此。
还有其他方法吗?