Django rest framework 同一个嵌套序列化程序能否用于输出不同的数据-Django Rest框架

Django rest framework 同一个嵌套序列化程序能否用于输出不同的数据-Django Rest框架,django-rest-framework,Django Rest Framework,如果我有这样的东西: class SnippetSerializer(serializers.HyperlinkedModelSerializer): owner = serializers.Field(source='owner.username') class Meta: model = Snippet fields = ('url', 'owner', 'title', 'code', 'linenos', 'language', 'sty

如果我有这样的东西:

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.Field(source='owner.username')

    class Meta:
        model = Snippet
        fields = ('url', 'owner', 'title', 'code', 'linenos', 'language', 'style')

class UserSerializer(serializers.HyperlinkedModelSerializer):
    snippets = SnippetSerializer()

    class Meta:
        model = User
        fields = ('url', 'username', 'snippets')
snippets = SnippetSerializer(fields=('title', 'code'))
然后,它将输出SnippetSerializer中定义的所有字段。但我希望能够做到这一点:

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.Field(source='owner.username')

    class Meta:
        model = Snippet
        fields = ('url', 'owner', 'title', 'code', 'linenos', 'language', 'style')

class UserSerializer(serializers.HyperlinkedModelSerializer):
    snippets = SnippetSerializer()

    class Meta:
        model = User
        fields = ('url', 'username', 'snippets')
snippets = SnippetSerializer(fields=('title', 'code'))
无需像这样执行重复的代码段序列化程序:

class SnippetSerializerSmall(serializers.HyperlinkedModelSerializer):
    owner = serializers.Field(source='owner.username')

    class Meta:
        model = Snippet
        fields = ('title', 'code')

有一些关于动态修改序列化程序字段的新文档今天刚刚在网站上发布

在这里逐字引用文档。。。 初始化序列化程序后,可以使用
.fields
属性访问序列化程序上设置的字段字典。通过访问和修改此属性,可以动态修改序列化程序

实例 例如,如果希望能够设置序列化程序在初始化时应使用哪些字段,可以创建一个序列化程序类,如下所示:

class DynamicFieldsModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed.
    """

    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop('fields', None)

        # Instatiate the superclass normally
        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)

        if fields:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields.keys())
            for field_name in existing - allowed:
                self.fields.pop(field_name)
这将允许您执行以下操作:

>>> class UserSerializer(DynamicFieldsModelSerializer):
>>>     class Meta:
>>>         model = User
>>>         fields = ('id', 'username', 'email')
>>>
>>> print UserSerializer(user)
{'id': 2, 'username': 'jonwatts', 'email': 'jon@example.com'}
>>>
>>> print UserSerializer(user, fields=('id', 'email'))
{'id': 2, 'email': 'jon@example.com'}

有一些关于动态修改序列化程序字段的新文档今天刚刚在网站上发布

在这里逐字引用文档。。。 初始化序列化程序后,可以使用
.fields
属性访问序列化程序上设置的字段字典。通过访问和修改此属性,可以动态修改序列化程序

实例 例如,如果希望能够设置序列化程序在初始化时应使用哪些字段,可以创建一个序列化程序类,如下所示:

class DynamicFieldsModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed.
    """

    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop('fields', None)

        # Instatiate the superclass normally
        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)

        if fields:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields.keys())
            for field_name in existing - allowed:
                self.fields.pop(field_name)
这将允许您执行以下操作:

>>> class UserSerializer(DynamicFieldsModelSerializer):
>>>     class Meta:
>>>         model = User
>>>         fields = ('id', 'username', 'email')
>>>
>>> print UserSerializer(user)
{'id': 2, 'username': 'jonwatts', 'email': 'jon@example.com'}
>>>
>>> print UserSerializer(user, fields=('id', 'email'))
{'id': 2, 'email': 'jon@example.com'}

是否可以为嵌套序列化程序指定字段?是否可以为嵌套序列化程序指定字段?