祖传序列化
动态字段&动态只读的序列化
DynamicFieldsModelSerializer
是祖传的,当view中需要动态设定字段时,或者设定只读字段时使用。
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
fields = kwargs.pop('fields', None)
read_only_fields = kwargs.pop('read_only_fields', None)
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
allowed = set(fields)
existing = set(self.fields.keys())
for field_name in existing - allowed:
self.fields.pop(field_name)
if read_only_fields is not None:
for field_name in read_only_fields:
self.fields[field_name].read_only = True
class UserSerializer(DynamicFieldsModelSerializer):
class Meta:
model = User
fields = '__all__'
class UserView(generics.RetrieveUpdateAPIView):
serializer_class = UserSerializer
permission_classes = (IsSuperUser, )
queryset = User.objects.filter(god=False)
def get_serializer(self, *args, **kwargs):
kwargs['fields'] = ('username', 'email')
# 更新时不允许修改username
kwargs['read_only_fields'] = ('username', )
return super(UserChangeView, self).get_serializer(*args, **kwargs)
尽量少使用serializers.SerializerMethodField
如果使用其的字段又查询了其他表。当view是list的时候慎用。
如果每页有10个元素,则需要查询11次。如果有2个SerializerMethodField
则需要查询21次。
如果非得要使用,请在view中的get_queryset中使用