验证模型字段作为小写唯一

时间:2015-07-03 14:08:47

标签: django django-models

我需要验证模型字段是否为小写唯一,但实际上没有将模型字段保存为小写;例如如果有人已经使用了用户名' 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))

......哪个有效,但对我来说感觉有点费解。我想知道是否有更简洁的方法来实现这个目标?

2 个答案:

答案 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?

有了更多详细信息(数据库类型,模型副本,您使用的是表单吗?),我可以扩展这个答案。