django rest框架序列化程序的混合
djangorestframework-serializer-mixins的Python项目详细描述
< djang-REST框架序列化器
如何安装
pip install djangorestframework-serializer-mixins
如何使用
假设您有一个post模型:
# testapp/models.pyfromdjango.confimportsettingsfromdjango.dbimportmodelsclassPost(models.Model):user=models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name='posts')title=models.CharField(max_length=128)body=models.TextField()created_at=models.DateTimeField(auto_now_add=True)updated_at=models.DateTimeField(auto_now=True)def__str__(self):returnself.titleclassMeta:ordering=['-created_at']
用动态FixFielSmixIn编写动态后置串行器:
# testapp/serializers.pyfromrest_frameworkimportserializersfromrest_framework_serializer_mixinsimportDynamicFieldsMixinfrom.modelsimportPostclassDynamicPostSerializer(DynamicFieldsMixin,serializers.ModelSerializer):classMeta:model=Postfields=('body','created_at','id','title','updated_at','user',)read_only_fields=('id','user',)
现在,您可以定义字段并像这样读取“只读”字段:
>>>fromdjango.contrib.auth.modelsimportUser>>>fromtestapp.modelsimportPost>>>fromtestapp.serializersimportDynamicPostSerializer>>>user=User.objects.create_user('user','user@email.com','123456')>>>post=Post.objects.create(user=user,title='My Title',body='My Body')>>>data=DynamicPostSerializer(post)# return fields and read_only_fields from Meta>>>serializer=DynamicPostSerializer(post)# return fields and read_only_fields from Meta>>>serializer.data{'body':'My Body','created_at':'2018-02-14T14:15:29.772209Z','id':1,'title':'My Title','updated_at':'2018-02-14T14:15:29.772312Z','user':1}>>>serializer=DynamicPostSerializer(post,fields=('title','body'))# return only title and body fields>>>serializer.data{'body':'My Body','title':'My Title'}>>>serializer=DynamicPostSerializer(post,read_only_fields=('title','body'),data={'title':'New Title','body':'New Body'})# set title and body as read_only_fields>>>serializer.is_valid()True>>>serializer.save()<Post:MyTitle>>>>serializer.data{'body':'My Body','created_at':'2018-02-14T14:15:29.772209Z','id':1,'title':'My Title','updated_at':'2018-02-14T14:19:14.838001Z','user':1}# title and body don't change