我使用的是Django 3.2和postgreSql 12。我添加了一个新的文本字段,应该是大小写不敏感的,即如果值'ab'存在,我希望DB在有人插入'ab'时失败请求。但是这个字段不应该在整个表中是唯一的,但在另一个领域是独一无二的(unique_together).我试着将字段创建为'CITEXT',因为它在Django 4.2中被弃用,所以我按照建议使用了Collation迁移。迁移通过了,在测试时,我发现我可以创建两个具有相同字母和不同大小写的对象。是我做错了什么,还是这种不区分大小写的实现不应该与'unique_together'一起工作?
归类迁移:
operations = [
CreateCollation(
"case_insensitive",
provider="icu",
locale="und-u-ks-level2-kn-true",
deterministic=True,
),
]
模型更改:
class MyItem(models.Model):
identifier = models.CharField(db_collation="case_insensitive", db_index=True, max_length=100, null=True)
container = models.ForeignKey(Container, related_name='my_items', on_delete=models.CASCADE, null=True)
class Meta:
unique_together = ('identifier', 'container_id')
运行迁移之后,我成功地创建了两个MyItem,它们具有相同的容器和标识符='ab'和'Ab'
1条答案
按热度按时间dkqlctbz1#
显然,它必须是非确定性的-
deterministic=False
。它基本上解决了这个问题。问题是,它提出了另一个问题,似乎是Django 3.2中的一个bug,在那里你不能对一个唯一的字段使用这个排序规则。