この単純なモデルがあるとしましょう:
class BlogPost(models.Model):
author = models.ForeignKey(MyUser)
body = models.TextField()
title = models.CharField(max_length=64)
urlid = models.CharField(max_length=32)
private_data = models.CharField(max_length=64)
private_data
API に公開したくないデータが含まれています (!)。私は ModelSerializer を使用しています:
class BlogPostSerializer(serializers.ModelSerializer):
class Meta:
model = BlogPost
def __init__(self, *args, **kwargs):
# Don't pass the 'request' arg up to the superclass
request = kwargs.pop('request', None)
# Instatiate the superclass normally
super(ModelSerializer, self).__init__(*args, **kwargs)
self.request = request
def absolute_url(self, blogpost):
return blogpost.get_absolute_url(self.request)
このabsolute_url
メソッドではrequest
、ドメイン名 (dev または prod など) と、それが http または https で作成されたかどうかを判別する必要があります。
モデル内のどのフィールドがシリアライザーによって返されるかを指定したい (たとえば、private_data を公開しない)。簡単です:
class BlogPostSerializer(serializers.ModelSerializer):
class Meta:
model = BlogPost
fields = ('author', 'body', 'title', 'urlid',)
# The same jazz after that
大丈夫、うまくいきます。ここで、absoluteUrl も返したいと思います。
class BlogPostSerializer(serializers.ModelSerializer):
absoluteUrl = serializers.SerializerMethodField('absolute_url')
class Meta:
model = BlogPost
fields = ('author', 'body', 'title', 'urlid',)
# The same jazz after that
当然のことながら、これは指定したフィールドのみを返し、absoluteUrl は返しません。モデルの特定のフィールドと、シリアライザーから計算されたabsoluteUrlのみを返すにはどうすればよいですか?
指定しない場合fields
、absoluteUrl を取得しますが、モデルのすべてのフィールド (private_data を含む) を取得します。に追加'absoluteUrl'
すると、存在しないfields
ためエラーが発生します(驚くことはありません)。このメソッドを使用できるblogpost.absoluteUrl
とは思わないhttp://django-rest-framework.org/api-guide/serializers.html#specifying-fields-explicitlyrequest
モデルの方法?)