0

我想创建一个自定义字段,这样如果查询该字段,则过滤器始终为 __iexact。

例子:

class Domain(models.Model):
    domain = models.IExactCharField()
    name = models.CharField()

我想要一个查询Domain.objects.filter('domain=newdomain')被重写为Domain.objects.filter('domain__iexact=newdomain').

我了解您可以使用自定义管理器执行此操作,但我想添加字段以添加自定义管理器。如果已经定义了自定义管理器,我希望将管理器功能链接起来。这可能吗?我正在研究该contribute_to_class方法,并认为在定义该字段时它可能具有一些潜力。

4

1 回答 1

0

下面的代码将不起作用 - 不幸的是,lookup_type 正在其他地方(在 QuerySet 中)添加。我进去看看:)

class IExactCharField(models.CharField):
    def get_prep_lookup(self, lookup_type, value):
        return super(IExactCharField, self).get_prep_lookup('iexact', value)

它强制执行 iexact 查找 - 您可以lookup_type在引用超类之前添加检查。

PS。请记住,某些数据库 (SQLite) 不支持不区分大小写的 unicode 字符串查找。

编辑:我唯一的解决方法是在 save() 或一些保存信号上使所有域字段小写。

于 2012-06-07T17:07:06.410 回答