python - Python - 动态序列化器.ModelSerializer 元类
问题描述
我想以这种方式创建和实例化。
from app.controller.Serializer import Serializer
from app.models import Stocks,Stocks2
stocks = Stocks.objects.all()
stocks2 = Stocks2.objects.all()
churchserzer = Serializer(Stocks, ('field1','field2'),stocks, many=True)
churchserzer2 = Serializer(Stocks2, ('field1','field2'),stocks2, many=True)
但是我对在创建序列化器实例之前应该如何将第一个和第二个序列化器参数值填充到它的 Meta 类变量感到困惑。然后调用父类的constructor方法。我想以这种方式实现 Serializer 类,但我不知道如何从init设置 Meta Class 变量值。
class Serializer(serializers.ModelSerializer):
def __init__(self, model,fields, objects, **kwargs):
self.model = model
self.fields = fields
# kwargs ( many=True )
super().__init__(objects,kwargs)
class Meta:
model = self.model
fields = self.fields
解决方案
您可以使用type在 python 中动态实例化一个类。
但是我不确定我是否会推荐它,因为我尝试过这样做,但结果确实令人印象深刻。我想这取决于您的具体需求。
但是,学习如何使用内置类型是一个很好的练习。
这是一个例子:
from rest_framework import serializers
from track.models import Track
Meta = type('Meta', (object,), dict(model=Track, fields=('band', 'link')))
TrackSerializer = type('TrackSerializer', (serializers.ModelSerializer,), dict(Meta=Meta))
In [2]: TrackSerializer()
Out[2]:
Serializer():
band = PrimaryKeyRelatedField(queryset=Band.objects.all())
link = CharField(max_length=511)
推荐阅读
- java - JButton 动作不在 JTable 内部执行
- java - 使用 GraalVM 在 AWS Lambda 中运行 Java
- c++ - C2065 'cout':未声明的标识符
- css - Boostrap Vue:将类名与标签混合
- angular - NGRX 选择器在存储中可用之前请求数据
- javascript - 出现 javascript 错误,但在 chrome 的开发人员工具中找不到代码的位置
- vbscript - Windows 功能更新 1803 下的 VBSCRIPT 缓慢
- powershell - PowerShell/Batch 从文件夹名称中删除结束文本
- c - C 套接字编程 - 连接到外部源
- r - R过滤包含单词组合的行