问题是:
我有这样一个模型:
class UserBook(models.Model):
user = models.ForeignKey(User)
book = models.ForeignKey(Book)
is_active = models.BooleanField(default=False)
class Meta:
unique_together = ("user", "book")
显然,该模型已经对字段user 和book 具有唯一的共同约束。数据库中可能会有这样的条目:
------------------------------
|user_id book_id is_active |
| 1 1 0 |
| 1 2 0 |
| 1 3 1 |
------------------------------
我还有一个约束要添加,即每个用户最多可以有一个条目,is_active 字段的值为 1(真)。
目前我通过将模型改成这样来解决这个问题:
class UserBook(models.Model):
user = models.ForeignKey(User)
book = models.ForeignKey(Book)
is_active = models.BooleanField(default=False)
key = models.charFeild(max_length=255, unique=True)
class Meta:
unique_together = ("user", "book")
def save(self, *args, **kwargs):
if self.is_active:
self.key = "%s_%s" %(self.user_id, self.is_active)
else:
self.key = "%s_%s_%s" %(self.user_id, self.is_active, self.book_id)
添加字段key,自定义该模型的save方法。
但在这种方法中,max_length 不能大于 255(在我的情况下无需担心,但有时 key 字段可能会很长)。
所以,我想知道是否有更优雅的方法来解决这类问题。
谢谢!
最佳答案
在Django 2.2 (目前作为 beta1 发布)您将能够使用 UniqueConstraint除了 fields
列表之外,还可以传递一个 condition
A Q object that specifies the condition you want the constraint to enforce.
For example, UniqueConstraint(fields=['user'], condition=Q(status='DRAFT') ensures that each user only has one draft.
关于python - 有没有更优雅的方法在 Django 模型中添加值敏感的唯一一起约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16474552/