目前,我有一个 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/