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