Django - 如何编写自定义查询集每个字段而不是每个模型

时间:2012-06-07 16:27:46

标签: django django-models django-managers

我想创建一个自定义字段,以便在查询字段时,过滤器始终为__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方法,并认为在定义字段时它可能有一些潜力。

1 个答案:

答案 0 :(得分: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()或一些保存信号上使所有域字段小写。