如何实现 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
。
该包没有依赖性,而且很轻。
- 从 pypi.org
安装
pip install django-case-insensitive-field
创建 fields.py 文件
向 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)
- 在您的 model/code
中随处使用新字段
# 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 不提供不区分大小写的模型字段,那么如何在不破坏现有代码的情况下使模型字段不区分大小写?例如:我的 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
。
该包没有依赖性,而且很轻。
- 从 pypi.org 安装
pip install django-case-insensitive-field
创建 fields.py 文件
向
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)
- 在您的 model/code 中随处使用新字段
# 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
就这些了!