Django中不区分大小写的字段

时间:2015-07-30 12:51:25

标签: 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'))

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

3 个答案:

答案 0 :(得分:3)

您可以拥有另一个基本上是该名称标记的字段。事实上,我认为将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 - 这确保了广泛用例的独特性。

答案 1 :(得分:2)

一个想法是在字段上实现不区分大小写的唯一约束。

可能的答案:

答案 2 :(得分:0)

只需在数据库中保存full_name和clean_full_name,并使clean_full_name唯一。

您可以通过将验证代码放在属性设置器中来验证full_name字段。有关详细信息,请查看this blog