我需要验证模型字段是否为小写唯一,但实际上没有将模型字段保存为小写;例如如果有人已经使用了用户名' david',那么用户名' David'不可用。我尝试了各种各样的东西,最终最终做了以下事情:
def _perform_unique_checks(self, unique_checks):
errors = {}
for model_class, unique_check in unique_checks:
lookup_kwargs = {}
for field_name in unique_check:
f = self._meta.get_field(field_name)
lookup_value = getattr(self, f.attname)
if lookup_value is None:
continue
if f.primary_key and not self._state.adding:
continue
lookup_kwargs[str(field_name)] = lookup_value
if len(unique_check) != len(lookup_kwargs):
continue
if 'username' in lookup_kwargs:
lookup_kwargs['username'] = lookup_kwargs['username'].lower()
qs = model_class._default_manager.filter(**lookup_kwargs)
model_class_pk = self._get_pk_val(model_class._meta)
if not self._state.adding and model_class_pk is not None:
qs = qs.exclude(pk=model_class_pk)
if qs.exists():
if len(unique_check) == 1:
key = unique_check[0]
else:
key = NON_FIELD_ERRORS
errors.setdefault(key, []).append(
self.unique_error_message(model_class, unique_check))
......哪个有效,但对我来说感觉有点费解。我想知道是否有更简洁的方法来实现这个目标?
答案 0 :(得分:1)
您是否尝试过对field_name__iexact进行过滤,以进行不区分大小写的匹配?
iregex,icontains和iexact过滤器应该能够满足您的需求。
答案 1 :(得分:0)
首先,您可以为此功能使用 clean (尝试验证表单时触发):
def clean__field_name(self):
此外,您可以向相关字段添加unique=True
约束。然后在保存期间执行Try/Except
以捕获任何IntegrityError
,这将告诉您该字段不是唯一的。数据库和模型应该为您完成这项工作,而不是尝试围绕它编写代码。
另见Case insensitive unique model fields in Django?
有了更多详细信息(数据库类型,模型副本,您使用的是表单吗?),我可以扩展这个答案。