作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个模型,其自身有一个 forgein key 。例如:
class Folder(models.Model):
name = models.CharField()
parent_folder = models.ForeignKey('self', null=True, blank=True, default=None, on_delete=models.CASCADE)
就我的目的而言,我从不希望 parent_folder
引用自身,但此模型的默认管理界面确实允许用户选择自己的实例。我怎样才能阻止这种情况发生?
编辑:如果您像我一样尝试进行分层树布局,那么您需要注意的另一件事是循环父关系。 (例如,A 的父级是 B,B 的父级是 C,C 的父级是 A。)避免这种情况不是这个问题的一部分,但我想我会提到它作为提示。
最佳答案
我个人会在模型级别执行此操作,因此如果您以其他形式重用该模型,您也会收到错误:
class Folder(models.Model):
name = models.CharField()
parent_folder = models.ForeignKey('self', null=True, blank=True, default=None, on_delete=models.CASCADE)
def clean(self):
if self.parent_folder == self:
raise ValidationError("A folder can't be its own parent")
如果您在表单中使用此模型,请使用查询集,这样模型本身就不会出现:
class FolderForm(forms.ModelForm):
class Meta:
model = Folder
fields = ('name','parent_folder')
def __init__(self, *args, **kwargs):
super(FolderForm, self).__init__(*args, **kwargs)
if hasattr(self, 'instance') and hasattr(self.instance, 'id'):
self.fields['parent_folder'].queryset = Folder.objects.exclude(id=self.instance.id)
关于django - 如何让外键 ('self' ) 的管理员禁止引用自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37946885/
我是一名优秀的程序员,十分优秀!