在Django REST框架3中,一个ModelSerializer可以为创建与更新提供不同的字段集吗?

时间:2016-02-21 23:03:17

标签: django django-rest-framework

我有一个DRF 3.3+ API来创建/更新/检索用户。我在password字段上使用超级方便的write_only序列化程序字段参数,以便它用于创建/更新用户,但在序列化用户时不会返回。但是,我想创建用户需要password,但更新用户是可选的。如果write_onlycreate_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+中的这个用例。提前感谢任何见解。

2 个答案:

答案 0 :(得分:3)

没有create_onlyupdate_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)