1

この単純なモデルがあるとしましょう:

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_dataAPI に公開したくないデータが含まれています (!)。私は 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モデルの方法?)

4

1 に答える 1

4

フィールドを指定しない場合、absoluteUrl を取得しますが、モデルのすべてのフィールド (private_data を含む) を取得します。フィールドに「absoluteUrl」を追加すると、blogpost.absoluteUrl が存在しないため、エラーが発生します (驚くことではありません)。

タプルに追加'absoluteUrl'するだけでfields、問題なく動作するはずです-では、どのようなエラーが表示されますか?

absolute_url メソッドには、ドメイン名 (dev または prod など) と、それが http または https で作成されたかどうかを判断するための要求が必要です。

を変更せずにシリアライザーにコンテキストを渡すこともできることに注意してください。シリアライザーをインスタンス化__init__するときに a を渡すだけです。ジェネリック ビューの既定のセットがこれを行うため、任意のシリアライザー メソッドでcontext={'request': request}アクセスできます。self.context['request'](これは、ハイパーリンクされた関係が完全修飾 URL を返すことができる方法であることに注意してください)

于 2013-07-26T11:27:38.303 に答える