![](/img/trans.png)
[英]Add user specific fields to Django REST Framework serializer
[英]Django Rest Framework Serializer add elements to Meta.fields
我有一個自定義的序列化程序類,是通過復制此問題的答案而創建的,但是在此示例中, fields
參數將替換原始的Meta.fields
屬性,而我想要的是向Meta.fields
添加新元素。 有什么辦法可以做到嗎?
這是我的序列化器:
class DynamicModelSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
fields = kwargs.pop('fields', None)
add_fields = kwargs.pop('add_fields', None)
exclude = kwargs.pop('exclude', None)
nest = kwargs.pop('nest', None)
if nest is not None:
self.Meta.depth = nest
super(DynamicModelSerializer, 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 exclude is not None:
for field_name in exclude:
self.fields.pop(field_name)
是的,您可以這樣做,如下所示更改DynamicModelSerializer:
class DynamicModelSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
fields = kwargs.pop('fields', None)
add_fields = kwargs.pop('add_fields', None)
exclude = kwargs.pop('exclude', None)
nest = kwargs.pop('nest', None)
if nest is not None:
self.Meta.depth = nest
super(DynamicModelSerializer, 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 add_fields is not None:
for field_name, field_class in add_fields.items():
### first pop the old field class from the fields if it's there
if field_name in self.fields:
self.fields.pop(field_name)
### now add the field to the fields
self.fields[field_name] = field_class
if exclude is not None:
for field_name in exclude:
self.fields.pop(field_name)
用法:
class ExampleSerializer(DynamicModelSerializer):
test1 = serializers.CharField()
class Meta:
model = Example
fields = ('test1', 'test2', 'test3')
ser = ExampleSerializer(fields=('test1', 'test3'), add_fields={'addField1': serializers.CharField()})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.