django - 使用带有注释的 Django CheckConstraint

标签 django django-models django-queryset django-q

我有一个 Django 模型,其中每个实例都需要一个从三个字段派生的唯一标识符:

class Example(Model):
    type = CharField(blank=False, null=False)           # either 'A' or 'B'
    timestamp = DateTimeField(default=timezone.now)
    number = models.IntegerField(null=True)             # a sequential number

这会产生一个形式为 [type][timestamp YEAR][number] 的标签,除非 number,否则必须是唯一的一片空白。

我想我可以使用几个注释:
uid_expr = Case(
    When(
        number=None,
        then=Value(None),
    ),
    default=Concat(
        'type', ExtractYear('timestamp'), 'number',
        output_field=models.CharField()
    ),
    output_field=models.CharField()
)

uid_count_expr = Count('uid', distinct=True)

我覆盖了模特经理的 get_queryset默认情况下应用注释,然后尝试使用 CheckConstraint :
class Example(Model):
    ...

    class Meta:
        constraints = [
            models.CheckConstraint(check=Q(uid_cnt=1), name='unique_uid')
        ]

这将失败,因为它无法在名为 uid_cnt 的实例上找到一个字段。 ,但是我认为 Q 可以访问注释对象。它看起来像 CheckConstraint直接对模型进行查询,而不是使用管理器返回的查询集:
class CheckConstraint(BaseConstraint):
    ...

    def _get_check_sql(self, model, schema_editor):
        query = Query(model=model)
    ...

有没有办法将约束应用于注释?或者有更好的方法吗?

我真的很想在 db 层强制执行这个。

谢谢。

最佳答案

这是伪代码,但请尝试:

class Example(Model):
    ...

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['type', 'timestamp__year', 'number'], 
                condition=Q(number__isnull=False),
                name='unique_uid'
            )
        ]

关于django - 使用带有注释的 Django CheckConstraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60291949/

相关文章:

python - 如何根据用户输入更改 Django 查询查找

python - Django 从 ImageField 更改图像名称

python - Django 1.5 : Display foreignkey values in both admin models

python-social-auth 和 Django,用自定义模型替换 UserSocialAuth

python - 如何在 Django 中进行连接?

django - GeventSocketIOWorker 没有属性 'socket'

python - 在 Snow Leopard 上安装 MySQLdb

Django QuerySet get_or_create - TypeError - save() 得到了一个意外的关键字参数 'using'

python - 根据最新子记录的条件过滤 Django 中的模型

python - 如何注释多个 Django 模型