Задать условия для поля в Django Model - PullRequest
0 голосов
/ 20 ноября 2018

Это мои модели:

class UserModel(models.Model):
    name = models.CharField(max_length=200)
    role = models.CharField(max_length=200)

class TestModel(models.Model):
    field1 = models.TextField()
    field2 = models.TextField()
    owner = models.ForeinkeyField(UserModel, on_delete=models.CASCADE)

Пусть поле role может иметь значения role1, role2 и role3

, и я хочу ограничитьTestModel имеющий owner with role=role3

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете установить параметр choices в полях модели, чтобы ограничить параметры, доступные пользователю (он изменяет виджет поля формы с виджета TextInput на виджет Select).Обратите внимание, что это добавляет проверку для этих значений, когда cleaning модель, это не применяет это на уровне базы данных.Это работает, когда вы используете ModelForm и затем запускаете is_valid() в форме, например.

И вы можете установить опцию limit_choices_to для полей ForeignKey.Это ограничит варианты, предлагаемые пользователю в соответствующем поле формы при создании ModelForm.Опять же, это не применяется на уровне базы данных и не добавляет никакой проверки модели.Вам придется добавить свою собственную проверку в форму или в модель, например, путем переопределения метода clean модели или переопределением метода clean_owner формы модели .

Итак, на вашей модели вы можете сделать это:

def clean(self):
    if self.owner and not self.owner.role == 'role3':
        raise ValidationError({'owner': 'Owner must have role3'}, code='invalid')
0 голосов
/ 20 ноября 2018

Чтобы ограничить возможные значения для поля роли;

class UserModel(models.Model):
    ROLE_CHOICES = (
        ('role1', 'Role 1'),
        ('role2', 'Role 2'),
        ('role3', 'Role 3'),
    )

    name = models.CharField(max_length=200)
    role = models.CharField(max_length=200, choices=ROLE_CHOICES)

Чтобы ограничить владельцев TestModel для role3, я не думаю, что есть способ принудительно установить его на уровне базы данных, но если вы используетеDjango Rest Framework, вы можете принудительно установить его на уровне приложения, написав собственный класс разрешений для представления, отвечающего за создание записей TestModel, чтобы позволить только пользователям с role3 быть владельцем экземпляра TestModel.Это будет выглядеть так:

class TestModelPermissions(permissions.BasePermission):
    def has_permission(self, request, view):
        if view.action == 'create':
            return request.user.role == 'role3'

        return True
...