【问题标题】:How can I only change the fields attribute in inherited serializer class in DRF?如何仅更改 DRF 中继承的序列化程序类中的字段属性?
【发布时间】:2021-08-06 05:33:30
【问题描述】:

我有一个序列化器:-

class SuperUserListSerializer(serializers.Modelserializer):
    class Meta:
        model = User
        fields = (
            'id',
            'username',
            'email',
            'password',
            'first_name',
            'last_name',
            'phone_number',
            'birth_date',
            'is_active',
            'is_staff',
            'is_superuser',
            'groups',
        )

我想从这个序列化器中删除一些字段,所以我做了什么,重写了 Meta 类并为序列化器提供了适当的必需字段:-

class UserListSerializer(SuperUserListSerializer):
    class Meta:
        model = User
        fields = (
            'id',
            'username',
            'email',
            'password',
            'first_name',
            'last_name',
            'phone_number',
            'birth_date',
            'is_active',
            'groups',
        )

我对这种方法不满意,有什么办法可以让我不需要重新引入 Meta 类,并为第二个序列化程序传递/更改适当的字段

【问题讨论】:

    标签: python-3.x django api class django-rest-framework


    【解决方案1】:

    如果你想继承SuperUserListSerializer,你可以这样做:

    1. 减去字段:
    class UserListSerializer(SuperUserListSerializer):
        class Meta(SuperUserListSerializer.Meta):
            model = User
            fields = tuple(set(SuperUserListSerializer.Meta.fields) - set(['is_staff', 'is_superuser']))
    
    1. 添加字段:
    class UserListSerializer(SuperUserListSerializer):
        class Meta(SuperUserListSerializer.Meta):
            model = User
            fields = SuperUserListSerializer.Meta.fields + ("new_field", )
    

    但是,如果您不想继承 SuperUserListSerializer,请执行以下操作:

    common_fields = (
                'id',
                'username',
                'email',
                'password',
                'first_name',
                'last_name',
                'phone_number',
                'birth_date',
                'is_active',
                'groups',
            )
    
    class SuperUserListSerializer(serializers.Modelserializer):
        class Meta:
            model = User
            fields = common_fields + ('is_staff', 'is_superuser')
    
    class UserListSerializer(serializers.Modelserializer):
        class Meta:
            model = User
            fields = common_fields
    

    【讨论】:

    • 不过,我们还是需要引入 Meta 类,我在想如果没有它也能做到这一点
    • 如果继承SuperUserListSerializer,想改fields,则必须继承父类的Meta,因为,Meta本身就是一个类。
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多