验证模型字段是不是为唯一的小写字母

Posted

技术标签:

【中文标题】验证模型字段是不是为唯一的小写字母【英文标题】:Validating a model field to be unique as lower case验证模型字段是否为唯一的小写字母 【发布时间】:2015-09-21 09:55:39 【问题描述】:

我需要验证模型字段是否是唯一的小写字母,但实际上没有将模型字段保存为小写;例如如果有人已经使用了用户名“大卫”,则用户名“大卫”将不可用。我尝试了各种方法,最终完成了以下操作:

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))

...这可行,但对我来说有点令人费解。我想知道是否有更简洁的方法来实现这一点?

【问题讨论】:

【参考方案1】:

您是否尝试过过滤 field_name__iexact,以进行不区分大小写的匹配?

iregex、icontains 和 iexact 过滤器应该能够满足您的需求。

【讨论】:

【参考方案2】:

首先,您可以使用 clean 来实现此功能(在尝试验证表单时触发):

def clean__field_name(self):

此外,您可以将unique=True 约束添加到相关字段。然后在保存期间执行Try/Except 以捕获任何IntegrityError,这将告诉您该字段不是唯一的。数据库和模型应该为您完成这项工作,而不是尝试围绕它编写代码。

另见Case insensitive unique model fields in Django?

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

【讨论】:

以上是关于验证模型字段是不是为唯一的小写字母的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 模式:验证唯一字段,不区分大小写

Django 验证列组合是不是存在(具有布尔字段的唯一性)

模型字段唯一性验证错误处理

使用引导验证器验证表单字段是不是仅包含字母

大小写字母验证

具有唯一字段的 Laravel 验证服务