我有一个像这样的博客内容模型:
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中实现这种情况?
答案 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
属性为您的视图设置身份验证策略