【问题标题】:Case insensitive Charfield in django modelsdjango 模型中不区分大小写的 Charfield
【发布时间】:2012-02-28 17:29:43
【问题描述】:

我正在尝试实现名称为unique=True 的类别模型, 但实际上我仍然可以在不同的情况下添加相同的类别名称。

即我有一个类别叫做食物 我仍然可以添加食物,食物,食物,食物

这背后有他们的哲学吗?或者它正在进行中。

因为在现实世界中,如果我想到食物类别,它永远是食物,无论它曾经提到过自己的什么情况。

提前感谢您查看此内容。

【问题讨论】:

    标签: django-models case-insensitive


    【解决方案1】:

    回答我自己的问题:

    我发现我可以在我的模型上使用干净的方法。所以我加了

    class Category(models.Model):
        name = models.CharField(max_length=200, unique=True)
    
        def clean(self):
            self.name = self.name.capitalize()
    

    首字母大写,然后由save方法处理,调用validate_unique方法报错。

    【讨论】:

    • 2017:效果很好!
    • 2021:不工作
    【解决方案2】:

    您可以使用名为 Citext fields (case insensitive fields) 的 Postgre 特定模型字段。

    目前有三个选项:

    class CICharField(**options)class CIEmailField(**options)class CITextField(**options)

    例子:

    from django.db import models
    
    from django.contrib.postgres.fields import CICharField
    
    
    class Category(models.Model):
        name = CICharField(verbose_name="Name", max_length=255)
    
    

    但不要忘记为 citext 字段创建扩展名。 See here.

    基本上,您必须在迁移文件中添加扩展类,在operations 数组中,在第一个CreateModel 操作之前。

    # migration file
    
        operations = [
            CITextExtension(),        # <------ here
            migrations.CreateModel(
                ...
            ),
            ...,
        ]
    
    

    【讨论】:

    • "不要忘记为 citext 字段创建扩展名。请参阅此处。"链接坏了
    • @devordem 谢谢,更新了评论。
    【解决方案3】:

    将列设置为不区分大小写的排序规则应该可以解决此问题。您可能需要在 SQL 级别执行此操作。

    【讨论】:

    • 您的意思是将列设置为“区分大小写”?问题是如何在 Django 中做到这一点。
    • 我认为这是一种更好的方法。没有在 save 方法上调用 Clean
    猜你喜欢
    • 2014-08-08
    • 2016-03-05
    • 2021-10-14
    • 2020-08-29
    • 2011-12-08
    • 2012-07-29
    • 2017-06-26
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多