python - 有没有更优雅的方法在 Django 模型中添加值敏感的唯一一起约束?

标签 python django django-models django-database

问题是:

我有这样一个模型:

class UserBook(models.Model):
    user = models.ForeignKey(User)
    book = models.ForeignKey(Book)
    is_active = models.BooleanField(default=False)

    class Meta:
        unique_together = ("user", "book")

显然,该模型已经对字段userbook 具有唯一的共同约束。数据库中可能会有这样的条目:

    ------------------------------
    |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方法。

但在这种方法中,ma​​x_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/

相关文章:

django模型形式,根据ForeignKey模型中的值限制选择

python - Django Admin 中的通用关系/通用外键

python - flask-admin is_accessible 用法

Django 重写保存方法 : to return super(). save() 还是不返回?

django - 我的网址未正确更新,添加了一些额外的路径本身

python - Django 自定义客户端登录页面未进行身份验证

python - 如何在线程中使用 telethon

python - 如何判断从文件中读取的字符串是否为数字?

python - 如何在 Python 上实现一个既可以接受内置类型又可以接受自定义类的函数?

python - 在保持标签的同时将大范围压缩为 python 中的较短范围