首页 > 解决方案 > 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

标签: pythondjangodjango-serializer

解决方案


您可以使用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)

推荐阅读