这是我的模特:
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
答案 0 :(得分:2)
您可以在模型字段上设置choices
选项以限制用户可用的选项(它将表单字段的窗口小部件从TextInput
小部件更改为Select
小部件)。请注意,这会在cleaning
模型时增加对这些值的验证,而不会在数据库级别强制执行。例如,当您使用ModelForm
然后在表单上运行is_valid()
时,它会起作用。
您可以为ForeignKey
字段设置limit_choices_to
选项。创建ModelForm
时,这将限制在相应的表单字段中提供给用户的选择。同样,这不是在数据库级别强制执行的,并且不会向模型添加任何验证。您必须在表单或模型上添加自己的验证,例如overriding the model's clean
method或overriding 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