如何实现 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 中的唯一模型字段和区分大小写(postgres)