安心・健康・痩せる方法

アンヘルシープログラマーの備忘録

DjangoRest FrameWorkで違うSerializerのfieldを使い回す方法

タイトルが長いですね

何がやりたかったかというと簡単な話です

親のSerializer   
    fields =('項目A', '項目B', '項目B', '項目C')   
子のSerializer   
    親のFields に加えて 項目D

継承使えば簡単でしょって思ってたんですが結果的には継承では上手くいかないことが分かったので

class BaseSerializer(serializers.ModelSerializer):

    class Meta:
        model = Mymodel
        fields = ('field_a',  )

class ChildSerializer(BaseSerializer):
    field_b = serializers.CharField()

    class Meta:
        model = Mymodel

    def __init__(self, *args, **kwargs):
        self.Meta.fields = list(BaseSerializer.Meta.fields)
        self.Meta.fields.append('field_b')
        super(ChildSerializer, self).__init__(*args, **kwargs)

def init()で親のfieldsを読み込むなんて、これ継承の意味ないじゃんって気もします
Childの方のfieldsに何かを書くと上書きされてしまうので意味がないし、Baseのfieldsに全部書いておいて不要項目を取り除きながら使う方法もありますが、それだとSerializer呼ぶところ全部に必要項目渡さなきゃ行けないしちょっとめんどい、childの方にfield_aとbを宣言する方法も採れますが、いまいち感満載。

なんか良い方法あるんだろうなぁと思いつつとりあえず自分なりの解決方法だけ残しておきます