如何实现 Django 不区分大小写的模型字段?

Posted

技术标签:

【中文标题】如何实现 Django 不区分大小写的模型字段?【英文标题】:How to Implement Django Case Insensitive Model Field? 【发布时间】:2021-08-02 05:01:38 【问题描述】:

Django 没有不区分大小写的模型字段,那么如何在不破坏现有代码的情况下使模型字段不区分大小写?例如:我的UserModel 上有一个username 字段,但我注意到尽管使该字段唯一,它仍然允许我使用相同单词的大小写变体:

下面的例子:


from django.db import models

class UserModel(models.Model):

    username = models.CharField(max_length=16, unique=True)



user1 = UserModel(username='user1') # will go through

user1.save()


user2 = UserModel(username='User1') # will still go through

user2.save()

【问题讨论】:

【参考方案1】:

有很多方法可以解决这个问题,但我建议使用来自pypi.org 的django-case-insensitive-field

包没有依赖,很轻。

    从 pypi.org 安装
pip install django-case-insensitive-field

    创建一个fields.py文件

    将 Mixin 添加到您想要不区分大小写的 Field。下面的例子:


# fields.py

from django_case_insensitive_field import CaseInsensitiveFieldMixin
from django.db.models import CharField

class LowerCharField(CaseInsensitiveFieldMixin, CharField):
    """[summary]
    Makes django CharField case insensitive \n
    Extends both the `CaseInsensitiveFieldMixin` and  CharField \n
    Then you can import 
    """

    def __init__(self, *args, **kwargs):

        super(CaseInsensitiveFieldMixin, self).__init__(*args, **kwargs)
    在您的模型/代码中随处使用新字段

# models.py

from .fields import LowerCharField


class UserModel(models.Model):

    username = LowerCharField(max_length=16, unique=True)

user1 = UserModel(username='user1') # will go through


user2 = UserModel(username='User1') # will not go through

就是这样!

【讨论】:

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

Django中不区分大小写的字段

Django 中的唯一模型字段和区分大小写(postgres)

Django 中的唯一模型字段和区分大小写(postgres)

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

如何设置MySQL中表的大小写区分

如何在不区分大小写的情况下执行 model.objects.get(**kwargs)