如何使字段不区分大小写且唯一?

Posted

技术标签:

【中文标题】如何使字段不区分大小写且唯一?【英文标题】:How can I make a field case insensitive and unique only? 【发布时间】:2021-07-11 22:29:40 【问题描述】:

我正在尝试向我的模型添加唯一且不区分大小写的对象,因此如果我先添加“car”然后尝试添加“cAr”,它应该会返回错误。不过,我不知道该怎么做。 我怎样才能做到这一点?

这是模型:

class Food(models.Model):
    name = models.CharField(max_length=100, unique=True)

    def __str__(self):
        return self.name

这是序列化程序:

class FoodSerializer(serializers.ModelSerializer):

    class Meta:
        model = Food
        fields = '__all__'  

【问题讨论】:

阅读那篇文章 - concisecoder.io/2018/10/27/… 这能回答你的问题吗? Case insensitive unique model fields in Django? @marmeladze 在这种情况下,这些事情似乎都没有改变 您使用的是哪个数据库?如果是 PostgreSQL,你可以使用 CIText docs.djangoproject.com/en/3.1/ref/contrib/postgres/fields/… 【参考方案1】:

您可以制作您的自定义 LowerCharField 并在您的模型中使用它只需导入此类 并且可以检查 car 和 Car 的唯一性。 这是我的解决方案。

 class LowerCharField(with_metaclass(models.SubfieldBase, models.CharField)):
        def __init__(self, *args, **kwargs):
            self.is_lowercase = kwargs.pop('lowercase', False)
            super(LowerCharField, self).__init__(*args, **kwargs)
    
        def get_prep_value(self, value):
            value = super(LowerCharField, self).get_prep_value(value)
            if self.is_lowercase:
                return value.lower()
            return value

你可以这样做

class Food(models.Model):
    name =LowerCharField(max_length=128, lowercase=True, null=False, unique=True)

    def __str__(self):
        return self.name

如果您想要进一步自定义,例如您可以从用户那里获取任何输入,即最后的汽车或汽车,您可以转换为较低的并检查唯一性。

【讨论】:

以上是关于如何使字段不区分大小写且唯一?的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql中使字段区分大小写

Mongoose 模式:验证唯一字段,不区分大小写

Mongoose 模式:验证唯一字段,不区分大小写

Swift 1/2 AutoComplete 字段不区分大小写

在使用 SpringBoot 开发的 REST API 中映射到 Java 对象时,使 JSON 有效负载字段不区分大小写

如何使 Oracle 不区分大小写