ant*_*koo 3 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"])
Run Code Online (Sandbox Code Playgroud)
换句话说:创建用户时,如果type == "silly",则为他设置权限“foo”,如果类型为“正常”则不设置。并且在检索用户时,type == "silly"如果用户设置了权限“foo”,如果没有则设置“正常”。
不允许/不需要用户更新,但我也有兴趣知道如何将其应用于更新。
没有测试过,但这种方法应该有效。只是为了阅读,您可以使用SerializerMethodField。但这种类型的字段是只读的。要包含type在内,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2641 次 |
| 最近记录: |