引用以下链接作为示例(其他地方也存在大量其他示例): http://www.django-rest-framework.org/api-guide/serializers/#dynamically-modifying-fields
据了解,Django 序列化器字段通常使用元组定义,该元组是不可变的:
class UserSerializer(DynamicFieldsModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
但是,动态更改序列化器字段的可接受方法涉及使用 pop (self.fields.pop(field_name)
)
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop('fields', None)
# Instantiate the superclass normally
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)
字段如何定义? Django 序列化程序中有预处理步骤吗?
最佳答案
看:
def fields(self):
"""
A dictionary of {field_name: field_instance}.
"""
# `fields` is evaluated lazily. We do this to ensure that we don't
# have issues importing modules that use ModelSerializers as fields,
# even if Django's app-loading stage has not yet run.
if not hasattr(self, '_fields'):
self._fields = BindingDict(self)
for key, value in self.get_fields().items():
self._fields[key] = value
return self._fields
How do fields get defined?
现在应该很清楚了。
Is there a pre-processing step in Django serializers?
是的。 这个“步骤”叫做metaclass
而Serializer
、Model
、Forms
都是元类。
关于python - Django 序列化器 : why does self. fields.pop ('field_name' )工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50848182/