python - Django根据参数使用不同的序列化器
问题描述
我有一个提供模型实例的 APIView。我想根据 url 参数使用不同的序列化程序,因为我想根据参数提供不同的字段。我不想使用 if else 检查所有情况,所以我使用了一个函数,该函数根据类型键从序列化器对象 dict 提供序列化器。有没有好的解决方案?有人有更好的建议吗?另外,您在考虑使用不同的端点而不是这种方法。这是代码:
网址.py
from django.urls import path
from .views import MySerializerTestView
urlpatterns = [
path('<slug:type>', MySerializerTestView.as_view()),
]
模型.py
from django.db import models
class MyModel(models.Model):
field_first = models.CharField(max_length=10)
field_second = models.CharField(max_length=10)
field_third = models.CharField(max_length=10)
视图.py
from .models import MyModel
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import MyFirstSerializer,MySecondSerializer,MyThirdSerializer
class MySerializerTestView(APIView):
def get(self, request, **kwargs):
my_data = MyModel.objects.all()
serializer = self.get_serializer(self.kwargs['type'],my_data)
return Response(serializer.data)
def get_serializer(self,type,data):
my_serializers = {
'first':MyFirstSerializer(data,many=True),
'second':MySecondSerializer(data,many=True),
'third':MyThirdSerializer(data,many=True),
}
return my_serializers[type]
序列化程序.py
from .models import MyModel
from rest_framework import serializers
class MyFirstSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['field_first']
class MySecondSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['field_second']
class MyThirdSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['field_third']
解决方案
您可以根据所采取的操作发送参数或选择序列化程序。
在您的“view.py”文件中,您可以使用“get_serializer_class (self)”方法来执行此操作。
def get_serializer_class(self):
if 'parameter' in self.request.query_params:
return ParameterSerializer
if self.action == "list" or self.action == 'retrieve':
return ListSerializer
else:
return CreateSerializer
推荐阅读
- pdf - 使用 Python 3.7 在 SharePoint 页面上读取 PDF 时出错
- python - Jupyter 笔记本环境
- gitlab - Gitlab CI 共享运行器无法启动
- tfs - Azure devops 拉取请求中的 Sonarqube Quality Gate 状态链接始终指向 localhost
- mysql - 当本地 MySql 没有使用 ADF 参考的日期字段时,如何将增量数据从本地 MySql 复制到 Azure MySql
- c# - 如何将 DirectoryInfo.EnumerateDirectories 转换为 List
- html - 从右到左设置线性梯度
- reactjs - 从另一个页面接收 POST 提交时,反应应用程序中无法 POST 错误
- php - 有没有办法通过 PHP 在 Wordpress 中创建一个未在站点菜单上自动显示的公共页面或 URL?
- javascript - 当根组件中的值更改时,子组件中的 Vue.js props 值不会更新