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