Django rest框架字段与自定义保存/恢复逻辑
问题描述:
如何创建一个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”。
不允许更新用户/需要,但我有兴趣知道如何应用此更新。
答
没有测试,但这种方法应该工作。只为阅读你可以用户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)
就只好改变'USER_TYPE = validated_data.get( '类型')''来USER_TYPE = validated_data.pop( '类型')'和'之前超()移动。创建()',否则'User.objects.create()'在'TypeError:'类型'内部崩溃是该函数的无效关键字参数。像魅力一样工作,谢谢! – anttikoo