DRF: Как включить / отключить редактирование других полей в зависимости от значения конкретного поля? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть модель содержимого блога, подобная этой:

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 голосов
/ 01 марта 2019

Для решения таких проблем, как определение того, должен ли запрос быть предоставлен или запрещен доступ для определенного объекта, разрешения являются более подходящим подходом

Создайте пользовательский класс разрешений и переопределите экземпляр-level has_object_permission method

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

0 голосов
/ 25 февраля 2019

По вашему мнению, переопределите метод update, где вы проверяете значение status в самом начале.

Второй способ - создать класс разрешений, который будет проверять метод и статус.Но я думаю, что использование класса разрешений для такой задачи немного излишне

...