Django 3.2 CITTEXT和unique_together

92vpleto  于 2023-04-22  发布在  Go
关注(0)|答案(1)|浏览(120)

我使用的是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'

dkqlctbz

dkqlctbz1#

显然,它必须是非确定性的-deterministic=False。它基本上解决了这个问题。
问题是,它提出了另一个问题,似乎是Django 3.2中的一个bug,在那里你不能对一个唯一的字段使用这个排序规则。

相关问题