我有一个查询,使用filter()
或extra()
使用Django约定似乎很难。通过这种方式,我认为执行原始SQL查询并将其转换为查询集对我来说是一个更好的解决方案。
因此我开始搜索如何执行原始SQL查询以及如何从raw创建查询集。
我从CaryMRobbins找到了将原始转换为查询集的解决方案。所以我决定把它放在models.py
:
from django.db import connection, models
class MyManager(Manager):
def raw_as_qs(self, raw_query, params=()):
"""Execute a raw query and return a QuerySet. The first column in the
result set must be the id field for the model.
:type raw_query: str | unicode
:type params: tuple[T] | dict[str | unicode, T]
:rtype: django.db.models.query.QuerySet
"""
cursor = connection.cursor()
try:
cursor.execute(raw_query, params)
return self.filter(id__in=(x[0] for x in cursor))
finally:
cursor.close()
class MyModel(models.Model):
objects = MyManager()
但它似乎无法正常工作,因为它返回一个空的查询集。
在views.py
我添加以下脚本:
raw = ''' My huge
query working'''
queryset = MyModel.objects.raw_as_qs(raw)
print queryset # result is empty list : []
遵循这种方法我缺少什么?
我很难理解return self.filter(id__in=(x[0] for x in cursor))
如何转换为qs。