【发布时间】:2012-02-28 17:29:43
【问题描述】:
我正在尝试实现名称为unique=True 的类别模型,
但实际上我仍然可以在不同的情况下添加相同的类别名称。
即我有一个类别叫做食物 我仍然可以添加食物,食物,食物,食物
这背后有他们的哲学吗?或者它正在进行中。
因为在现实世界中,如果我想到食物类别,它永远是食物,无论它曾经提到过自己的什么情况。
提前感谢您查看此内容。
【问题讨论】:
标签: django-models case-insensitive
我正在尝试实现名称为unique=True 的类别模型,
但实际上我仍然可以在不同的情况下添加相同的类别名称。
即我有一个类别叫做食物 我仍然可以添加食物,食物,食物,食物
这背后有他们的哲学吗?或者它正在进行中。
因为在现实世界中,如果我想到食物类别,它永远是食物,无论它曾经提到过自己的什么情况。
提前感谢您查看此内容。
【问题讨论】:
标签: django-models case-insensitive
回答我自己的问题:
我发现我可以在我的模型上使用干净的方法。所以我加了
class Category(models.Model):
name = models.CharField(max_length=200, unique=True)
def clean(self):
self.name = self.name.capitalize()
首字母大写,然后由save方法处理,调用validate_unique方法报错。
【讨论】:
您可以使用名为 Citext fields (case insensitive fields) 的 Postgre 特定模型字段。
目前有三个选项:
class CICharField(**options)、class CIEmailField(**options) 和 class CITextField(**options)
例子:
from django.db import models
from django.contrib.postgres.fields import CICharField
class Category(models.Model):
name = CICharField(verbose_name="Name", max_length=255)
但不要忘记为 citext 字段创建扩展名。 See here.
基本上,您必须在迁移文件中添加扩展类,在operations 数组中,在第一个CreateModel 操作之前。
# migration file
operations = [
CITextExtension(), # <------ here
migrations.CreateModel(
...
),
...,
]
【讨论】:
将列设置为不区分大小写的排序规则应该可以解决此问题。您可能需要在 SQL 级别执行此操作。
【讨论】: