django 我们可以根据视图和用户类型修改序列化器字段吗?

pxq42qpu  于 2022-12-24  发布在  Go
关注(0)|答案(1)|浏览(88)

我有一个User串行化器与以下字段,我试图只添加一些字段的列表视图,但要返回不同的一组字段的详细信息视图,这些是字段:-

super_user_list_fields = ( 'id', 'username', 'email', 'password', 'first_name', 'last_name', 'phone_number', 'birth_date', 'is_active', 'is_staff', 'is_superuser', 'groups', )
super_user_detail_fields = ( 'id', 'username', 'password', 'first_name', 'last_name', 'email', 'bio', 'url', 'company', 'location', 'phone_number', 'birth_date', 'notes', 'is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions', 'last_login', 'date_joined', )
normal_user_list_fields = (.......,)
normal_user_detail_fields = (........,)

这些是我的serilaizer:-

class UserSerializer(serilaizers.ModelSerializer):
    class Meta:
        model = User
        fields = super_user_list_fields

我有两个视图,第一个是ListCreateAPIView的扩展,第二个是RetrieveUpdateDestroy
现在,我还想根据user对象的类型更改其中的一些字段,例如为超级用户、非超级用户等设置不同的字段集。
我在想,是否可以有这样的方法:

class serializer(...):
    class Meta:
        model = User
        fields = get_the_required_fields()
        ..........
        ..........
        .........
    def get_the_required_fields(self, ....):
    user = self.request.user
    if user.is_superuser and (viewtype is ListCreateAPIView):
        return super_user_list_fields
    if user.is_superuser and (viewtype is RetrieveUpdateDestroyAPIView):
        return super_user_detail_fields
     .........
     ........
     .......
cbjzeqam

cbjzeqam1#

class DynamicFieldsSerializer(serializers.ModelSerializer):

    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields', None)

        super().__init__(*args, **kwargs)

        if fields is not None:
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)

class Serializer(DynamicFieldsAllTransactionSerializer):

    class Meta:
        model = ModelName
        fields = "__all__"

Serializer(QuerySet,many=True,fields=('id', 'username', 'email', 'password', 'first_name', 'last_name', 'phone_number', 'birth_date', 'is_active', 'is_staff', 'is_superuser', 'groups',))

相关问题