Рассмотрим простую модель:
class Item(models.Model):
name = models.CharField(...)
unit_cost = models.DecimalField(...)
unit_price = models.DecimalField(...)
Он имеет следующий класс администратора:
class ItemAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = self.model._default_manager.get_query_set()
qs2 = self.model._default_manager.raw('''
SELECT
"stock_item"."id",
"stock_item"."name",
"stock_item"."unit_cost",
"stock_item"."unit_price"
FROM
"stock_item"
''')
qs3 = RawQuerySet('''
SELECT
"stock_item"."id",
"stock_item"."name",
"stock_item"."unit_cost",
"stock_item"."unit_price"
FROM
"stock_item"
''', self.model)
return qs # WORKS
return qs2 # DOESN'T WORK
return qs3 # DOESN'T WORK
Я переопределяю метод queryset (), чтобы контролировать поведение администратораПосмотреть список.Я хочу выполнить необработанный SQL-запрос в queryset (), отобразить результаты обратно в модель элементов перед отправкой их в представление списка.Проблема в том, что при возврате qs2 или qs3 в шаблоне возникает следующая ошибка (без исключения):
Database error
Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user.
Помните, что выполнение необработанного запроса в отдельном сценарии работает, например:
items = Item._default_manager.raw('''
SELECT
"stock_item"."id",
"stock_item"."name",
"stock_item"."unit_cost",
"stock_item"."unit_price"
FROM
"stock_item"
''')
for item in items:
print item.name, item.unit_price # WORKS!
На самом деле, у меня больше амбиций, чтобы я мог создать своего рода «виртуальную модель», у которой не должно быть соответствующей таблицы базы данных, целью которой является инкапсуляция запросов проекции sql в свой класс администратора.(чтобы модель могла отображаться в виде списка администратора).
Я попробовал другой подход, вообще не используя ItemAdmin, а вместо этого:
class ItemManager(models.Manager):
def get_query_set(self):
return Item._default_manager.raw('''
SELECT
"stock_item"."id",
"stock_item"."name",
"stock_item"."unit_cost",
"stock_item"."unit_price"
FROM
"stock_item"
''')
с:
class Item(models.Model):
objects = ItemManager()
etc...
Но теперь я получаю исключение шаблона в представлении списка администратора:
Объект 'RawQuerySet' не имеет атрибута 'complex_filter'
Что делать?Спасибо ...