django-rest-framework - 具有自定义保存/恢复逻辑的 Django 休息框架字段

标签 django-rest-framework

如何使用自定义保存/恢复逻辑创建 Django 休息框架读写字段?我正在使用 DRF 3.5.4 和 Django 1.8。

像这样:

class UserSerializer(serializer.Serializer):
    # username is a field in the backing model, no problemo
    username = serializers.CharField()

    # type is not an actual model field, but reflects whether the user has 
    # Django permission "foo" set. I.e. "normal" = no permission, "silly" = 
    # permission is set.
    type = serializers.ChoiceField(["normal", "silly"])

换句话说:当创建用户时,如果 type == "silly",则为他设置权限 "foo",如果类型为 "normal",则不设置。并且在检索用户时,type == "silly" 如果用户设置了权限 "foo",如果没有则输入 "normal"。

不允许/不需要用户更新,但我也想知道如何将其应用于更新。

最佳答案

没有测试,但这种方法应该有效。只是为了阅读,您可以使用 SerializerMethodField .但是这种类型的字段是只读的。要在 validated_data 中输入 ,您需要使用自定义字段。

from rest_framework import serializers   

class UserTypeField(serializers.CharField):

    def get_attribute(self, instance):
        return 'silly' if instance.has_perm('foo') else 'normal'


def set_permission_by_type(instance, user_type):
    if user_type == 'silly':
        instance.add_perm('foo')
    elif user_type == 'normal':
        instance.remove_perm('foo')


class UserSerializer(serializers.ModelSerializer):
    type = UserTypeField()

    def update(self, instance, validated_data):
        user_type = validated_data.pop('type', None)
        instance = super().update(instance, validated_data)
        if user_type:
            set_permission_by_type(instance, user_type)
        return instance

    def create(self, validated_data):
        user_type = validated_data.pop('type', None)
        instance = super().create(validated_data)
        if user_type:
            set_permission_by_type(instance, user_type)
        return instance

关于django-rest-framework - 具有自定义保存/恢复逻辑的 Django 休息框架字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42549704/

相关文章:

django - 如何定义 APIView 的 url?

python - 在 Django Rest Framework 中使用嵌套序列化程序进行序列化程序字段验证

python - 如何在通用 View 中为同一请求使用不同的 Django Rest Framework 序列化程序?

Django rest swagger post 参数未显示在 Swagger 文档上

python - 在 Django Rest Framework 中下拉外键选择

python - Django Rest Framework 身份验证被拒绝

django - Swagger Django [规范中未定义操作]

python - 使用 django rest 框架教程时出现 TypeError

Django - DRF 删除/检索/补丁返回 404 { 详细信息 : "Not found" }

django - “is_superuser”是此函数的无效关键字参数