我有一个模型 ( A
),它有 2 个外键:b
和c
.
b
并且c
应该是唯一的,包括 NULL
因此b
,并且c
应该只一起为 NULL ONCE
但是,我无法在 Django 中完成此操作。这是我到目前为止的代码。任何帮助表示赞赏!
-_-
class A(models.Model):
b = models.ForeignKey('B', blank = True, null = True)
c = models.ForeignKey('C', blank = True, null = True)
class Meta:
unique_together = (
('b', 'c')
)
此代码将在数据库中产生这种不需要的结果:
+----+------+------+
| id | b_id | c_id |
+----+------+------+
| 1 | 2 | 3 |
| 2 | 2 | 77 |
| 3 | 2 | NULL |
| 4 | 2 | NULL |
| 5 | NULL | NULL |
| 6 | NULL | NULL |
+----+------+------+
前 2 行只能由 django 插入一次。这很棒:)
但是,剩余的行对我来说是重复的条目,我想限制这一点。
更新
我找到了一些可以完成工作的东西,但它看起来真的很hacky..有什么想法吗?
class A(models.Model):
def clean(self):
from django.core.exceptions import ValidationError
if not any([self.b, self.c]):
if Setting.objects.filter(b__isnull = True, c__isnull = True).exists():
raise ValidationError("Already exists")
elif self.b and not self.c:
if Setting.objects.filter(c__isnull = True, b = self.b).exists():
raise ValidationError("Already exists")
elif self.c and not self.user:
if Setting.objects.filter(c = self.c, b__isnull = True).exists():
raise ValidationError("Already exists")