我有一个DRF 3.3+ API来创建/更新/检索用户。我在password
字段上使用超级方便的write_only序列化程序字段参数,以便它用于创建/更新用户,但在序列化用户时不会返回。但是,我想创建用户需要password
,但更新用户是可选的。如果write_only
和create_only
具有更细粒度的控制权,那么取而代之的是update_only
,而不是password
。由于那个不可用,我有两个完全相同的序列化器,除了class Term {
private String word;
private int freq;
Term(String word,int freq){
this.word = word;
this.freq = freq;
}
public String getWord()
{
return word;
}
public int getFreq()
{
return freq;
}
public void setFreq(int freq)
{
this.freq = freq;
}
}
字段,它看起来并不干净。
我知道DRF 2的这个答案:Disable field update after object is created,但我希望有更好的方法来处理DRF 3.3+中的这个用例。提前感谢任何见解。
答案 0 :(得分:3)
没有create_only
或update_only
类似选项。
您可以覆盖__init__
以查看是否已通过instance
参数并相应地调整fields
。
我有两个串行器,就像你一样。为了不重复太多,我有另一个子类,子类只调整不同的fields
。
答案 1 :(得分:2)
我认为没有内置功能。
但你可以做这样的事情来定义依赖于action
的字段:
class FooSerializer(serializers.ModelSerializer):
# define fields depending on action
_action_fields = {'update': ['name'],
'create': ['name', 'password'],
'default': ['name', 'password']}
class Meta:
model = Foo
fields = ['name', 'password'] # define max fields you want serialize
def __init__(self, *args, **kwargs):
serializers.ModelSerializer.__init__(self, *args, **kwargs)
action = kwargs['context']['view'].get('action', 'default') # I'm not 100% sure if action is defined here. But something similar
allowed = set(self._action_fields[action])
existing = set(self.fields.keys())
for field_name in existing - allowed:
self.fields.pop(field_name)