DjangoのRESTフレームワークに対応しまし3.0+
ダイナミックフィールド、http://www.django-rest-framework.org/api-guide/serializers/#dynamically-modifying-fieldsを参照してください - このアプローチは、シリアライザ内のすべてのフィールドを定義し、その後、あなたは選択したくないものを削除することができます。
またはあなたはまた、シリアライザの初期化中Meta.fieldsとあなたの周りには混乱モデルシリアライザ、このような何かを行うことができます:これは "ある場合にかかわらず、
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ('code',)
def __init__(self, *args, **kwargs):
if SHOW_CLASSIFICATION: # add logic here for optional viewing
self.Meta.fields = list(self.Meta.fields)
self.Meta.fields.append('classification')
super(ProductSerializer, self).__init__(*args, **kwargs)
あなたはトムに依頼する必要があるだろう長期計画には適合しない可能性があるため、「正しい方法」を選択する必要があります。
DjangoのRESTフレームワーク< 3.0
このような何か試してみてください:
class ProductSerializer(serializers.Serializer):
...
classification = serializers.SerializerMethodField('get_classification')
def get_classification(self, obj):
return getattr(obj, 'classification', None)
複数のシリアライザ
別のアプローチをフィールドの異なるセットを持つ複数のシリアライザを作成することです。 1つのシリアライザは別のシリアライザを継承し、追加のフィールドを追加します。次に、get_serializer_class
メソッドでビュー内の適切なシリアライザを選択できます。次に、このアプローチを使用して、異なるシリアライザを呼び出して、ユーザオブジェクトがリクエストユーザと同じ場合に異なるユーザデータを表示する方法の実際の例を示します。私はセキュリティコンテキストで使用してきた別のアプローチは、to_representation
方法でフィールドを削除することで表現
からフィールドを削除する
def get_serializer_class(self):
""" An authenticated user looking at their own user object gets more data """
if self.get_object() == self.request.user:
return SelfUserSerializer
return UserSerializer
。
def remove_fields_from_representation(self, representation, remove_fields):
""" Removes fields from representation of instance. Call from
.to_representation() to apply field-level security.
* remove_fields: a list of fields to remove
"""
for remove_field in remove_fields:
try:
representation.pop(remove_field)
except KeyError:
# Ignore missing key -- a child serializer could inherit a "to_representation" method
# from its parent serializer that applies security to a field not present on
# the child serializer.
pass
のようなメソッドを定義して、あなたのシリアライザで、
def to_representation(self, instance):
""" Apply field level security by removing fields for unauthorized users"""
representation = super(ProductSerializer, self).to_representation(instance)
if not permission_granted: # REPLACE WITH PERMISSION LOGIC
remove_fields = ('classification',)
self.remove_fields_from_representation(representation, remove_fields)
return representation
のようにそのメソッドを呼び出して、このアプローチは簡単で柔軟性があるが、それは時々表示されないフィールドをシリアル化のコストがかかります。しかし、それはおそらく大丈夫です。
それは許容されますか? –
これらは存在しません。私はSOAP Webサービスを呼び出しています。これには、sudsを使用するオプションのフィールドがあります。応答オブジェクトは、返されるXMLを表し、場合によってはオプションフィールドを含みません。 – abstractpaper
トム私はちょうどあなたが意味していることを理解している。理想的には、私はそれらが全く存在しないようにしたいですが、私は当面は「None」と一緒に暮らすことができます。 – abstractpaper