想象一下这样的事情:
class User(models.Model):
name = CharField(max_length=80)
class TelephoneNumber(models.Model):
phone_number = CharField(max_length=10)
user = ForeignKey(User)
is_default_number = BooleanField
假设我想保证每个用户只有一个默认电话号码。我们想拥有多少就拥有多少is_default_number == False
,但每个人都user
应该只有一个拥有is_default_number == True
。
有没有办法通过 Django 在数据库级别强制执行此操作?我知道纯 Python 中的一个简单解决方案是:
class TelephoneNumber(models.Model):
phone_number = CharField(max_length=10)
user = ForeignKey(User)
is_default_number = BooleanField
def save(self, *args, **kwargs):
other_defaults_same_user = TelephoneNumber.objects.filter(
user=self.user,
is_default_number=True
).exclude(
pk=self.pk
)
if self.is_default_number and other_defaults_same_user.exists():
raise ValidationError("Can't have two phone numbers as default"
" for one user.")
super(TelephoneNumber, self).save(*args, **kwargs)
但这很容易受到竞争条件错误的影响,而且我不喜欢每次保存时都必须进行额外读取(不过,在某些时候可能需要额外读取)。有什么方法可以在 Django 中实现这一点吗?如果我们必须使答案依赖于数据库,我很想看看答案,但显然独立于后端的答案是最好的。