【问题标题】:In Django REST framework 3, can one ModelSerializer have different sets of fields for create vs. update?在 Django REST framework 3 中,一个 ModelSerializer 是否可以有不同的字段集用于创建和更新?
【发布时间】:2016-06-03 06:23:33
【问题描述】:

我有一个 DRF 3.3+ API 来创建/更新/检索用户。我在我的password 字段上使用了超级方便的write_only 序列化器字段参数,以便它用于创建/更新用户,但在序列化用户时不会返回。但是,我想让password 创建用户是必需的,但更新用户是可选的。而不是write_only,最好有create_onlyupdate_only 这样的东西来进行更细粒度的控制。由于这不可用,我有两个完全相同的序列化程序,除了 password 字段,它看起来不干净。

我知道 DRF 2 的这个答案:Disable field update after object is created,但我希望在 DRF 3.3+ 中有更好的方法来处理这个用例。提前感谢您提供任何见解。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    没有create_onlyupdate_only 之类的选项。

    可以覆盖 __init__ 以查看是否传递了 instance 参数并相应地调整 fields

    我有两个序列化器,就像你一样。为了不重复太多,我有一个子类另一个,子类只调整不同的fields

    【讨论】:

    • 谢谢,我没有想过从另一个序列化器派生,所以在有更好的方法之前,我会采用这种方法。至少这样,重复的代码(和额外的代码)很少。
    【解决方案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)
    

    【讨论】:

    • 谢谢,但上面的解决方案对我来说效果更好,上面的答案是第一位的。我很乐意给你部分功劳,但可惜 SO 不允许 :(
    猜你喜欢
    • 2017-03-05
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2019-04-26
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多