2017-03-02 74 views
0

如何创建一个Django rest框架读写字段与自定义保存/恢复逻辑?我使用的是DRF 3.5.4和Django 1.8。Django rest框架字段与自定义保存/恢复逻辑

事情是这样的:

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"]) 

换句话说:创建用户时,如果类型==“傻”,允许“foo”被设定为他和没有设置,如果类型是“正常”。当检索用户时,如果用户拥有“foo”权限,则输入==“傻”,如果不是,则输入“normal”。

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

回答

1

没有测试,但这种方法应该工作。只为阅读你可以用户SerializerMethodField。但是这种类型的字段是只读的。要在validated_data中有type,您需要使用自定义字段。

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) 

    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) 
+0

就只好改变'USER_TYPE = validated_data.get( '类型')''来USER_TYPE = validated_data.pop( '类型')'和'之前超()移动。创建()',否则'User.objects.create()'在'TypeError:'类型'内部崩溃是该函数的无效关键字参数。像魅力一样工作,谢谢! – anttikoo

相关问题