【问题标题】:Django UniqueConstraint usecaseDjango UniqueConstraint 用例
【发布时间】:2021-02-10 14:29:10
【问题描述】:

我有模型用户和地址,地址模型包含用户作为外键。是否有可能处理这个用例,在多个用户地址的情况下,一个用户可以有一个默认地址?这是一个示例代码。 谢谢。

class User(models.Model):
    name = models.CharField(max_length=10)
class Address(models.Model):
    address = models.CharField(max_length=10)
    active=models.BooleanField(default=False)
    user = models.ForeignKey(
    User,
    blank=False,
    null=False,
    related_name="user_address", on_delete=models.CASCADE)
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'active'],
                                condition=models.Q(active=True),
                                name='user default address.')
        ]

【问题讨论】:

  • 你到底是怎么设置默认地址的,你当前的UniqueConstraint有什么问题
  • 我想通过仅在一个地址上标记活动字段来设置默认地址,而对于所有其他用户地址未选中它。使用当前的 UniqueConstraint 无法正常工作,并允许将多个地址标记为活动。

标签: django django-models unique-constraint


【解决方案1】:

你必须稍微调整你的UniqueConstraint

  constraints = [
            models.UniqueConstraint(fields=['user'],
                                condition=models.Q(active=True),
                                name='unique_active_address')
        ]

编辑: 似乎您正在使用 MySQL 和 documented

条件参数被 MySQL 和 MariaDB 忽略,因为两者都没有 支持条件索引。

您不能在 MySQL 上使用唯一索引在数据库级别强制执行此操作,因为它不支持条件索引

【讨论】:

  • 我也尝试过这种方式,但它不起作用。
  • 您迁移数据库了吗?约束是数据库强制执行的
  • 你能解释一下吗?您是在谈论 Django 迁移还是 MySQL 约束?
  • 你必须在之后进行迁移/迁移
  • 也这样做了。尝试了它的不同组合。但这对我不起作用。你试过了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2017-04-13
相关资源
最近更新 更多