django rest框架序列化程序的可写嵌套帮助程序

drf-writable-nested的Python项目详细描述


DRF可写嵌套

Build Statuscodecovpypi

这是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',)

另外,您可以使用这个包中的NestedCreateMixinNestedUpdateMixin 如果只支持创建或更新逻辑。

例如,我们可以将以下带有相关嵌套字段的数据传递给 主序列化程序:

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只能应用于序列化程序 有独特的领域。

>排序

当你使用这两个混音时 (UniqueFieldsMixinNestedCreateMixinNestedUpdateMixin) 你应该把UniqueFieldsMixin放在前面。

例如:

class ChildSerializer(UniqueFieldsMixin, NestedUpdateMixin,
        serializers.ModelSerializer):

作者

2014-2018年,beda.software

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java抽象基bean类   Java中的字符串比较“=”有什么问题?   java Android VideoView无法播放视频   java Lucene 5.3 Highlighter getBestFragments()不工作   java将PDF直接从数据库打开到用户的PDF应用程序中   波形Java库用于确定wav文件中的语音注释   java gzip压缩器不支持while循环   java JUnit输出不包括小黄瓜前缀   java日志记录的复杂性和对MessageFormat性能的关注   spring是否有一种方法可以在每次使用Java控制器方法时调用该方法?   帮助器类上的java重写方法   java绘制曲线箭头,将箭头置于正确位置   内存mymap=new int[500000][500000]需要多大的Eclipse Java堆空间;没有OutOfMemoryError?   java Drools从具有不同事实的多个DRL文件中触发多个规则