我想创建一个自定义字段,以便在查询字段时,过滤器始终为__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
方法,并认为在定义字段时它可能有一些潜力。
答案 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()或一些保存信号上使所有域字段小写。