gpt4 book ai didi

django - 使用带有注释的 Django CheckConstraint

转载 作者:行者123 更新时间:2023-12-03 14:54:17 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com