Python-动态序列化器.ModelSerializer元类

时间:2018-12-20 09:36:32

标签: python django django-serializer

我想以此方式创建和实例化。

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)

但是我对在创建Serializer实例之前应如何将第一个和第二个Serializer参数值填充到其Meta类变量感到困惑。 然后调用父类的构造方法。 我正在考虑以这种方式实现Serializer类,但是我不知道如何从 init 设置元类变量值。

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

1 个答案:

答案 0 :(得分:0)

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