django rest框架序列化程序的可写嵌套帮助程序
drf-writable-nested的Python项目详细描述
DRF可写嵌套
这是django rest框架的可写嵌套模型序列化器,它 允许您使用相关的嵌套数据创建/更新模型。
支持以下关系:
- 一个管(正/反)
- 外键(直接/反向)
- 多个(直接/反向,不包括与直通模型的M2M关系)
- generirelation(这总是相反的)
要求
- Python(2.7、3.5、3.6)
- Django(1.9、1.10、1.11、2.0)
- djangorestframework(3.5+)
安装
pip install drf-writable-nested
用法
例如,对于以下模型结构:
fromdjango.dbimportmodelsclassSite(models.Model):url=models.CharField(max_length=100)classUser(models.Model):username=models.CharField(max_length=100)classAccessKey(models.Model):key=models.CharField(max_length=100)classProfile(models.Model):sites=models.ManyToManyField(Site)user=models.OneToOneField(User)access_key=models.ForeignKey(AccessKey,null=True)classAvatar(models.Model):image=models.CharField(max_length=100)profile=models.ForeignKey(Profile,related_name='avatars')
我们应该创建以下序列化程序列表:
fromrest_frameworkimportserializersfromdrf_writable_nestedimportWritableNestedModelSerializerclassAvatarSerializer(serializers.ModelSerializer):image=serializers.CharField()classMeta:model=Avatarfields=('pk','image',)classSiteSerializer(serializers.ModelSerializer):url=serializers.CharField()classMeta:model=Sitefields=('pk','url',)classAccessKeySerializer(serializers.ModelSerializer):classMeta:model=AccessKeyfields=('pk','key',)classProfileSerializer(WritableNestedModelSerializer):# Direct ManyToMany relationsites=SiteSerializer(many=True)# Reverse FK relationavatars=AvatarSerializer(many=True)# Direct FK relationaccess_key=AccessKeySerializer(allow_null=True)classMeta:model=Profilefields=('pk','sites','avatars','access_key',)classUserSerializer(WritableNestedModelSerializer):# Reverse OneToOne relationprofile=ProfileSerializer()classMeta:model=Userfields=('pk','profile','username',)
另外,您可以使用这个包中的NestedCreateMixin
或NestedUpdateMixin
如果只支持创建或更新逻辑。
例如,我们可以将以下带有相关嵌套字段的数据传递给 主序列化程序:
data={'username':'test','profile':{'access_key':{'key':'key',},'sites':[{'url':'http://google.com',},{'url':'http://yahoo.com',},],'avatars':[{'image':'image-1.png',},{'image':'image-2.png',},],},}user_serializer=UserSerializer(data=data)user_serializer.is_valid(raise_exception=True)user=user_serializer.save()
此序列化程序将自动创建所有嵌套关系,我们将收到 用填充的数据完成实例。
user_serializer=UserSerializer(instance=user)print(user_serializer.data)
{'pk':1,'username':'test','profile':{'pk':1,'access_key':{'pk':1,'key':'key'},'sites':[{'pk':1,'url':'http://google.com',},{'pk':2,'url':'http://yahoo.com',},],'avatars':[{'pk':1,'image':'image-1.png',},{'pk':2,'image':'image-2.png',},],},}
也可以通过调用将值传递给嵌套的序列化程序
到基序列化程序的save
方法。这些kwargs
必须是dict
类型。例如:
# user_serializer created with 'data' as aboveuser=user_serializer.save(profile={'access_key':{'key':'key2'},},)print(user.profile.access_key.key)
'key2'
注意:相同的值将用于所有嵌套实例,如默认值,但具有更高的优先级。
解决方案的已知问题
更新时具有唯一字段的嵌套序列化程序的验证问题
我们有一个专门的解决问题的方法。 MIXIN从验证阶段到保存阶段移动{{CD7}}。如果您想了解更多详细信息,可以阅读相关问题和文章: https://github.com/beda-software/drf-writable-nested/issues/1http://www.django-rest-framework.org/api-guide/validators/#updating-nested-serializers
用法示例:
class Child(models.Model):
field = models.CharField(unique=True)
class Parent(models.Model):
child = models.ForeignKey('Child')
class ChildSerializer(UniqueFieldsMixin, serializers.ModelSerializer):
class Meta:
model = Child
class ParentSerializer(NestedUpdateMixin, serializers.ModelSerializer):
child = ChildSerializer()
class Meta:
model = Parent
注意:UniqueFieldsMixin
只能应用于序列化程序
有独特的领域。
当你使用这两个混音时
(UniqueFieldsMixin
和NestedCreateMixin
或NestedUpdateMixin
)
你应该把UniqueFieldsMixin
放在前面。
例如:
class ChildSerializer(UniqueFieldsMixin, NestedUpdateMixin,
serializers.ModelSerializer):
作者
2014-2018年,beda.software