django rest框架的多态序列化程序。
django-rest-polymorphic的Python项目详细描述
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"