Django休息框架字段具有自定义保存/恢复逻辑

时间:2017-03-02 07:58:05

标签: django-rest-framework

如何使用自定义保存/恢复逻辑创建Django rest框架读写字段?我使用的是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"是为他设置的,如果类型是"正常"则不设置。在检索用户时,type == "silly"如果用户有权限" foo"设置,"正常"如果没有。

不允许/不需要更新用户,但我也有兴趣了解如何应用此更新。

1 个答案:

答案 0 :(得分:3)

没有测试它,但这种方法应该有效。只是为了阅读,您可以使用SerializerMethodField。但是这种类型的字段是只读的。要在typevalidated_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