DRF:如何启用/禁用其他字段'编辑取决于特定字段的值?

时间:2018-05-24 15:30:44

标签: django django-models django-rest-framework

我有一个像这样的博客内容模型:

class BlogContents:
    STATUS_CHOICES = (
        ('draft', 'Draft Content'),
        ('published', 'Publish Content'),
    )
    title = models.CharField(max_length=200, null=False)
    content = models.TextField(null=False)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft', null=False)

每当实例的status字段值为draft时,我希望允许用户对此模型执行任何操作(即列表,创建,检索,更新,删除)。但是,当status字段值更改为published时,我想禁用“更新”。该实例的行动。

如何在Django-rest-framework中实现这种情况?

2 个答案:

答案 0 :(得分:0)

在您的视图中,请覆盖update方法,在此方法的开头,您要检查status的值。

第二种方法是创建权限类,该类将检查方法和状​​态。但是,我认为,使用权限类执行此类任务有点过分了

答案 1 :(得分:0)

要解决诸如确定是否应授予或拒绝特定对象访问权限之类的问题,权限是一种更合适的方法

创建一个custom permission class并覆盖实例级has_object_permission方法

from rest_framework import permissions    


class IsDraftOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        # Disabling POST and PUT methods for non-draft objects (published)
        return (
            obj.status == 'draft' or
            request.method in ('GET', 'HEAD', 'OPTIONS', 'DELETE')
        )

然后,通过permission_classes属性为您的视图设置身份验证策略