我想通过连接字符串筛选一些数据库对象。
正常的SQL查询是:
SELECT concat(firstName, ' ', name) FROM person WHERE CONCAT(firstName, ' ', name) LIKE "a%";
在模型中,我创建了一个名为PersonObjects的管理器:
class PersonObjects(Manager):
attrs = {
'fullName': "CONCAT(firstName, ' ', name)"
}
def get_query_set(self):
return super(PersonObjects, self).get_query_set().extra(
select=self.attrs)
我还在我的模型中配置了这个:
objects = managers.PersonObjects()
现在访问全名对单个对象有效:
>>> p = models.Person.objects.get(pk=4)
>>> p.fullName
u'Fred Borminski'
但它在过滤器中不起作用:
>>> p = models.Person.objects.filter(fullName__startswith='Alexei')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/django/db/models/manager.py", line 141, in filter
return self.get_query_set().filter(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 550, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 568, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1128, in add_q
can_reuse=used_aliases)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1026, in add_filter
negate=negate, process_extras=process_extras)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1191, in setup_joins
"Choices are: %s" % (name, ", ".join(names)))
FieldError: Cannot resolve keyword 'fullName' into field. Choices are: firstName, gender, name, (...)
这是一个bug还是一个特性?我该怎么解决?
谢谢。
我通过实现自定义聚合函数解决了这个问题。 在这种情况下,我需要将各个字段连接到街道地址,以便能够筛选/搜索匹配项。 下面的聚合函数允许指定一个字段和一个或多个其他字段来执行SQL CONCAT。
2015年8月3日编辑:
从https://stackoverflow.com/a/19529861/3230522收集细节的更好的实现。如果在子查询中使用queryset,则前面的实现将失败。表名现在是正确的,尽管我注意到这只适用于同一个表中的列的连接。
建议的解决方案对下面代码中的postgresql和JSONB字段非常有用。仅返回“key”jsonb字段下具有“partner”键的记录:
不是虫子。
filter()
只检查模型定义,因此它不能将fullName
识别为声明字段(因为它不是-它是查询中的额外参数)。您可以使用
extra()
将fullName
添加到WHERE
:相关问题 更多 >
编程相关推荐