【问题标题】:immutable ownership (foreign key) for django-rest-frameworkdjango-rest-framework 的不可变所有权(外键)
【发布时间】:2014-01-28 03:35:18
【问题描述】:

如何处理不可变所有权,举例:

一旦用户创建{headline: 'test', owner: [user_id], body: 'test'}这样的对象,但在那之后,__update__上只有body字段是可变的。

波纹管是一些解决方案,我不确定哪个会更好:

  1. view_set 中的 createupdate 上使用不同的序列化程序
  2. get_serlializer_class 上使用不同的序列化程序,具体取决于request.method
  3. 用权限处理它,比如IsOwnerOrReadOnly,但没有字段permission

谢谢。

【问题讨论】:

    标签: django rest serialization django-rest-framework


    【解决方案1】:

    get_serializer 似乎是一个完美的地方,您可以访问请求和序列化程序:

    class MyAwesomeViewSet(viewsets.ModelViewSet):
        # my attributes
    
        def get_serializer(self, instance=None, data=None,
                       files=None, many=False, partial=False):
            s = super(MyAwesomeViewSet, self).get_serializer(instance, data, files, many, partial)
            if self.request.method == 'PUT':
                s.fields['headline'].read_only = True
                s.fields['owner'].read_only = True
    
            return s
    

    如果您发布只读数据,这不会给您任何错误,但它实际上不会更新数据库。

    【讨论】:

    • 这仍然允许更新PATCH。这指出了我对这个解决方案感到不安的地方:“HTTP 方法”和“更新对象”之间的映射在 rest-framework 的其他地方进行管理(并且可以自定义),但在这里我们再次对其进行硬编码。我认为如果它检查instance is None 而不是请求方法来确定我们是否正在更新现有对象,这个解决方案可能会更好。
    • 在我的情况下,即使请求是对现有对象的更新,实例也是无。我最终覆盖了更新并设置 self.is_update = True。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2019-07-02
    • 2016-01-09
    • 2015-03-27
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多