编程语言
首页 > 编程语言> > python-在Django模型中是否还有其他更优雅的方法可以将值敏感的唯一约束添加在一起?

python-在Django模型中是否还有其他更优雅的方法可以将值敏感的唯一约束添加在一起?

作者:互联网

这是问题所在:

我有一个这样的模型:

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_id  book_id  is_active |
    |      1        1          0 |
    |      1        2          0 |
    |      1        3          1 |
    ------------------------------

我还要添加一个约束,即每个用户最多可以有一个条目,即is_active字段的值为1(True).

目前,我通过将模型更改为此来解决此问题:

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)

添加一个字段键,并自定义此模型的保存方法.

但是在这种方法中max_length不能大于255(在我的情况下无需担心,但有时关键字段可能很长).

因此,我想知道是否还有其他更优雅的方法来解决此类问题.

谢谢!

解决方法:

重新定义is_active如下:

# Equals user ID if active; otherwise null.
is_active = models.IntegerField(null = True, unique = True)

用户ID在该列中将是唯一的(满足您​​所需的约束),并且该列中的许多空值都不会违反该约束,如here所述.

标签:django-database,python,django,django-models
来源: https://codeday.me/bug/20191123/2066722.html