【发布时间】:2023-03-27 13:48:01
【问题描述】:
考虑以下情况:-
假设我的应用允许用户在他们的 国家。为清楚起见,我们只考虑 ASCII 字符 在这里。
在美国,用户可以创建名为“德克萨斯”的州。如果这个应用程序 正在内部使用,假设用户不在乎它是否是 拼写为“texas”或“Texas”或“teXas”
但重要的是,如果出现以下情况,系统应该阻止创建“texas” “德克萨斯”已经在数据库中。
如果模型如下:
class State(models.Model):
name = models.CharField(max_length=50, unique=True)
postgres 中的唯一性是区分大小写的;也就是postgres 将允许用户按原样创建“texas”和“Texas” 被认为是独一无二的。
在这种情况下可以做些什么来防止这种行为。如何 使用 Django 提供 case-insenstitive 唯一性 Postgres
现在我正在执行以下操作以防止创建案例- 不敏感的重复。
class CreateStateForm(forms.ModelForm):
def clean_name(self):
name = self.cleaned_data['name']
try:
State.objects.get(name__iexact=name)
except ObjectDoesNotExist:
return name
raise forms.ValidationError('State already exists.')
class Meta:
model = State
在许多情况下,我必须进行此检查,但我并不热衷于在各处编写类似的 iexact 检查。
只是想知道是否有内置或 更好的方法?也许 db_type 会有所帮助?也许还有其他解决方案?
【问题讨论】:
-
我认为你已经做对了。至少我是这样处理标签的,所以我的标签云不会以“标签”、“标签”和“标签”结尾。
-
是的,但是在这里 Django 的内置 unique 并没有多大帮助,是吗?毕竟我必须自己到处做独特的检查。
-
我会对应用程序进行编码以确保字符串仅以小写形式进入数据库。然后检查一下。
-
我宁愿让用户保留他想保留的任何案例。
标签: django postgresql django-models unique