将条件设置为Django模型中的字段

时间:2018-11-20 13:11:00

标签: django django-rest-framework

这是我的模特:

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字段可以具有值role1role2role3

并且我想限制TestModel拥有owner with role=role3

2 个答案:

答案 0 :(得分:2)

您可以在模型字段上设置choices选项以限制用户可用的选项(它将表单字段的窗口小部件从TextInput小部件更改为Select小部件)。请注意,这会在cleaning模型时增加对这些值的验证,而不会在数据库级别强制执行。例如,当您使用ModelForm然后在表单上运行is_valid()时,它会起作用。

您可以为ForeignKey字段设置limit_choices_to选项。创建ModelForm时,这将限制在相应的表单字段中提供给用户的选择。同样,这不是在数据库级别强制执行的,并且不会向模型添加任何验证。您必须在表单或模型上添加自己的验证,例如overriding the model's clean methodoverriding the model form's clean_owner method

因此,在您的模型上,您可以这样做:

def clean(self):
    if self.owner and not self.owner.role == 'role3':
        raise ValidationError({'owner': 'Owner must have role3'}, code='invalid')

答案 1 :(得分:1)

限制角色字段的可能值;

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