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

How to Implement Django Case Insensitive Model Field?

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()

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

该包没有依赖性,而且很轻。

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

  1. 创建 fields.py 文件

  2. Field 添加一个 Mixin,使其不区分大小写。示例如下:


# 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)
  1. 在您的 model/code
  2. 中随处使用新字段

# 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

就这些了!