Django RestフレームワークでAPIを開発しています。フィールドをシリアライザから動的に削除したいのですが、別のフィールドの値に応じてフィールドを削除する必要があるという問題があります。どうすればよいですか?次のようなシリアライザを持っています。
class DynamicSerliazer(serializers.ModelSerializer):
type = serializers.SerializerMethodField()
url = serializers.SerializerMethodField()
title = serializers.SerializerMethodField()
elements = serializers.SerializerMethodField()
def __init__(self, *args, **kwargs):
super(DynamicSerliazer, self).__init__(*args, **kwargs)
if self.fields and is_mobile_platform(self.context.get('request', None)) and "url" in self.fields:
self.fields.pop("url")
ご覧のとおり、リクエストがモバイルプラットフォームから行われたかどうかに応じて、「url」フィールドはすでに削除しています。しかし、「type」の値に応じて「elements」フィールドを削除したいと思います。どうすればいいですか?
前もって感謝します
can シリアライゼーションの動作をカスタマイズする シリアライザでto_representation()
methodをオーバーライドする。
class DynamicSerliazer(serializers.ModelSerializer):
def to_representation(self, obj):
# get the original representation
ret = super(DynamicSerializer, self).to_representation(obj)
# remove 'url' field if mobile request
if is_mobile_platform(self.context.get('request', None)):
ret.pop('url')
# here write the logic to check whether `elements` field is to be removed
# pop 'elements' from 'ret' if condition is True
# return the modified representation
return ret
複数のシリアライザーを作成し、ビューから適切なものを選択できます
class IndexView(APIView):
def get_serializer(self):
if self.request.GET['flag']:
return SerializerA
return SerializerB
継承を使用してシリアライザをDRYにします。
私の問題はあなたの問題と幾分似ていて、継承で解決しました。
class StaticSerializer(serializers.ModelSerializer):
class Meta:
model = StaticModel
fields = (
'first_name', 'last_name', 'password', 'username',
'email'
)
class DynamicSerializer(StaticSerializer):
class Meta:
model = StaticModel
fields = (
'first_name',
)