django rest框架的多态序列化程序。

django-rest-polymorphic的Python项目详细描述


https://travis-ci.org/apirobot/django-rest-polymorphic.svg?branch=masterhttps://codecov.io/gh/apirobot/django-rest-polymorphic/branch/master/graph/badge.svghttps://badge.fury.io/py/django-rest-polymorphic.svg

django rest多态性

django rest框架的多态序列化程序。

概述

django-rest-polymorphic允许您为使用django-polymorphic库创建的继承模型轻松定义序列化程序。

安装

使用pip

安装
$ pip install django-rest-polymorphic

使用量

定义多态模型:

# models.pyfromdjango.dbimportmodelsfrompolymorphic.modelsimportPolymorphicModelclassProject(PolymorphicModel):topic=models.CharField(max_length=30)classArtProject(Project):artist=models.CharField(max_length=30)classResearchProject(Project):supervisor=models.CharField(max_length=30)

使用django-rest-framework

# serializers.pyfromrest_frameworkimportserializersfrom.modelsimportProject,ArtProject,ResearchProjectclassProjectSerializer(serializers.ModelSerializer):classMeta:model=Projectfields=('topic',)classArtProjectSerializer(serializers.HyperlinkedModelSerializer):classMeta:model=ArtProjectfields=('topic','artist','url')extra_kwargs={'url':{'view_name':'project-detail','lookup_field':'pk'},}classResearchProjectSerializer(serializers.ModelSerializer):classMeta:model=ResearchProjectfields=('topic','supervisor')

请注意,如果扩展HyperlinkedModelSerializer,而不是ModelSerializer,则需要定义extra_kwargs,以便将url指向多态序列化程序的相应视图。

然后,您必须创建一个多态序列化程序,它充当您在上面定义的模型和序列化程序之间的映射器:

# serializers.pyfromrest_polymorphic.serializersimportPolymorphicSerializerclassProjectPolymorphicSerializer(PolymorphicSerializer):model_serializer_mapping={Project:ProjectSerializer,ArtProject:ArtProjectSerializer,ResearchProject:ResearchProjectSerializer}

使用与多态序列化程序相等的序列化程序类创建视图集:

# views.pyfromrest_frameworkimportviewsetsfrom.modelsimportProjectfrom.serializersimportProjectPolymorphicSerializerclassProjectViewSet(viewsets.ModelViewSet):queryset=Project.objects.all()serializer_class=ProjectPolymorphicSerializer

测试:

$ http GET "http://localhost:8000/projects/"
HTTP/1.0200OKContent-Length:227Content-Type:application/json[{"resourcetype":"Project","topic":"John's gathering"},{"artist":"T. Turner","resourcetype":"ArtProject","topic":"Sculpting with Tim","url":"http://localhost:8000/projects/2/"},{"resourcetype":"ResearchProject","supervisor":"Dr. Winter","topic":"Swallow Aerodynamics"}]
$ http POST "http://localhost:8000/projects/"resourcetype="ArtProject"topic="Guernica"artist="Picasso"
HTTP/1.0201CreatedContent-Length:67Content-Type:application/json{"artist":"Picasso","resourcetype":"ArtProject","topic":"Guernica","url":"http://localhost:8000/projects/4/"}

自定义资源类型

从上面的示例中可以看到,为了指定多态模型的类型,需要发送一个带有resource type字段的请求资源类型的值应为模型的名称。

如果要将资源类型字段名从resourcetype更改为其他名称,则应重写resource_type_field_name属性:

classProjectPolymorphicSerializer(PolymorphicSerializer):resource_type_field_name='projecttype'...

如果要更改资源类型的行为,则应重写to_resource_type方法:

classProjectPolymorphicSerializer(PolymorphicSerializer):...defto_resource_type(self,model_or_instance):returnmodel_or_instance._meta.object_name.lower()

现在,创建新对象的请求如下:

$ http POST "http://localhost:8000/projects/"projecttype="artproject"topic="Guernica"artist="Picasso"

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

推荐PyPI第三方库


热门话题
java类。getResource和ClassLoader。getSystemResource:有没有理由选择其中一个而不是另一个?   在Java中以编程方式粘贴后恢复剪贴板   Java字符串到日期没有时间   JavaSpring注释:@Component起作用,@Repository不起作用   java“addScript”在HSQL中是否有最大记录计数?   java如何将值从JDialog框返回到父JFrame?   java我的模块库的用户有没有办法访问尚未导出的类?   java javac:未找到命令   java如何解决jsoup错误:无法找到请求目标的有效证书路径   类中的java作用域变量   Java中集合实现中的arraylist add()方法不起作用   java如何使用while循环和从用户接收输入来近似Pi?   java Spring安全CSRF培训模式   在安卓系统中,如何通过在警报框外单击来限制用户?