Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Веб-разработка и фреймворки > django extra и псевдонимы таблиц для вывода


Автор: newsTester 31.8.2009, 00:18
работаю с django ORM
задача следующая (почти из учебника): кроме всего прочего есть 2 таблицы 
1 - со списком тем, 
2 - указывает принадлежность книги к заданной теме, а так же имеется ли книга в магазине или ее надо заказать на складе.
Надо вывести таблицу с данными: назнание темы, сколько книг по теме имеется в наличии, сколько книг по теме можно раздобыть (т.е. есть в наличии или на складе), и отсортировать все темы по убыванию кол-ва книг в наличии.
Табличку хочу сгенерировать на уровне БД т.к. тем ну оччень много.
На данный момент разобралась как с помощью extra сделать одно из двух
таблицу с данными: назнание темы, сколько книг по теме имеется в наличии, и отсортировать все темы по убыванию кол-ва книг в наличии.
или
таблицу с данными: назнание темы, сколько книг по теме можно раздобыть (т.е. есть в наличии или на складе), и отсортировать все темы по убыванию кол-ва книг которые можно раздобыть.

Попытка добавить два вычисляемых поля не проходит т.к. при еденичном подключении к запросу таблиц фильтр по полю "в наличии" срабатывает на обоих полях и выходит
таблица с данными: назнание темы, 2 столбца "сколько книг по теме имеется в наличии", и отсортировать все темы по убыванию кол-ва книг в наличии.
А при повторном подключении таблиц получаю сообщение об ошибке не однозначности использования таблиц.
В документации читаю, что в extra есть возможность использовать псевдонимы таблиц, но вот как это делается я так и не поняла...

Если знаете научите как их использовать. А может я вообще слишком на мудрила и можно все решить красивее?

Автор: Daevaorn 31.8.2009, 00:25
Цитата(newsTester @  31.8.2009,  01:18 Найти цитируемый пост)
А может я вообще слишком на мудрила и можно все решить красивее? 

Явно перемудрено. Покажите модели и то как вы делаете запрос. Скорей всего extra  и не нужно.

Автор: newsTester 31.8.2009, 01:18
ну... допусти (т.к. по правде программа немного не про то, но ведь суть проблемы таже..) требуемый кусок модели выглядит так
Код


class Theams(models.Model):
    id = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=600, blank=True)
    class Meta:
        db_table = u'Theams'

class BooksInTheams(models.Model):
    books = models.ForeignKey(Books)
    theam = models.ForeignKey(Theams)
    include = models.CharField(max_length=1, blank=True)
    class Meta:
        db_table = u'Books_in_Theams'



тогда чтоб вывести табличку с подсчетом всех книг в наличии я пишу

Код


   ex_theamrs = Theams.objects.all()
    ex_theams.query.group_by.append('theams.id')
    ex_theams = ex_theams.extra(select = {'in_count': 'count(theams.id)'}, tables = ['theams', 'books_in_theams'],
                    where = [' books_in_theams.include = 1', ' theams.id = books_in_theams.theam']).order_by('-in_count')



а для того чтобы вывести табличку с подсчетом всех книг по теме вообще

Код


   ex_theamrs = Theams.objects.all()
    ex_theams.query.group_by.append('theams.id')
    ex_theams = ex_theams.extra(select = {'all_count': 'count(theams.id)'}, tables = ['theams', 'books_in_theams'],
                                    where = [' theams.id = books_in_theams.theam']).order_by('-all_count')



ЗЫ пока писала обратила внимание, что не естественно, то что наличие книги на месте прописано не в таблице Books а в таблице BooksInTheams, но мне надо именно так, точнее для реального условия это чуть ли не необходимо, так что прошу принять модель данных как величену не изменную.

Автор: Daevaorn 1.9.2009, 17:03
1.
Код

from django.db.models import Count

Theams.objects.filter(booksintheams__include='1').annotate(all_count=Count('booksintheams'))


2.
Код

Theams.objects.annotate(all_count=Count('booksintheams'))


А модели действительно ужасны.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)