python - Django 中不区分大小写的字段

标签 python django

目前,我有一个 Django 项目,其中包含一个名为 Event 的模型,该模型具有多个属性,其中之一是 full_name

from django.db import models


class Event(models.Model):
    description = models.CharField(blank=False, max_length=200)
    full_name = models.CharField(blank=False, null=True, max_length=200, unique=True)

我想要实现的是防止用户创建两个事件,其中一个名为 MyEvent,另一个名为 myevent,所以我想要名称不区分大小写。此外,我来自一个有一些有趣字母的国家,例如 š。用户已经习惯了不支持这些字母的计算机系统,因此我也想阻止两个事件的存在,一个叫做 šoo,另一个叫做 soo

基本上,我有一个函数 myfunction 并希望有一个模型约束,这样对于模型的每个实例,值 myfunction(instance.full_name) 都是唯一的.

我的第一个想法,也是可行的,是拥有一个带有干净全名函数的模型表单:

def clean_full_name(self):
    return myfunction(self.cleaned_data.get('full_name'))

这行得通。但是,我现在有一个 View ,我想在其中显示所有事件的全名,而在这里,我想显示原始名称。使用我的方法,这是不可能的(功能只是单向的)。对此有优雅的解决方案吗?

最佳答案

您可以有另一个字段,它基本上是名称的一部分。事实上,我认为将 name 作为唯一字段并不是一个好主意(但我应该澄清一下,我不知道你的要求)。

基本上,对 slug field ensures uniqueness 的验证.此外,您可以将 slug 字段从所有表单等中隐藏起来。

例子:

>>> from django.utils.text import slugify
>>> slugify(u"śtack Overflow")
u'stack-overflow'
>>> slugify(u"stack Overflow")
u'stack-overflow'
>>> slugify(u"stack  Overflow")
u'stack-overflow'
>>> slugify(u"stack \t Overflow")
u'stack-overflow'
>>> slugify(u"stack \n Overflow")
u'stack-overflow'

其中一些组合映射到相同的 slug - 这确保了广泛用例的唯一性。

关于python - Django 中不区分大小写的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31724298/

相关文章:

python - 对如何使用 numpy.pad 向我的 numpy imagearray 正确添加白色边框感到困惑

Python 使用正则表达式对相似模式进行分组

python - 通过重用代码和传递成员名称来运行测试来减少行数

python - 忽略具有计算能力 3.0 的可见 gpu 设备。最低要求的 Cuda 功能是 3.5

django - 如何为 django admin 安装 xadmin

python - Django 之外的 Django 模型

python - 使用 mod_wsgi 安装 Django

python - 字典,从键中调用值

django - 统一 Django 表单媒体

python - 如何过滤数据库表行并更新 Django 中的特定列?