Получить все доступные комбинации двух полей через Django ORM? - PullRequest
2 голосов
/ 02 апреля 2011

У меня есть эта модель Django:

class Lecture(models.Model):
    lecture_number = models.CharField(_('lecture number'), max_length=20)
    title = models.CharField(_('title'), max_length=100)
    term = models.IntegerField(_('term'), choices=TERM, db_index=True)
    year = models.IntegerField(_('year'), db_index=True)

term может быть либо 1, либо 2 (весна или осень). Теперь я хочу перечислить все термины, для которых существуют лекции, например, что-то вроде ((2007, 2), (2008, 1), (2008, 2), (2009, 1), (2009, 2), (2010, 1)). Список не должен быть отсортирован. Можно ли эффективно создать этот список через ORM? Лучшее решение, которое я нашел:

term_list = set(Lecture.objects.values_list('year', 'term'))

Но этот вызов ORM по-прежнему возвращает результат для каждого Lecture и уменьшает его в Python, поэтому он может расти медленно с большим набором Lecture s.

Ответы [ 2 ]

5 голосов
/ 02 апреля 2011

если у вас есть все данные в базе данных, то это будет работать.но если данных нет, вы должны сгенерировать их сами.

In [1]: import itertools
In [2]: list(itertools.product((2006,2007,2008), (1,2)))
Out[2]: [(2006, 1), (2006, 2), (2007, 1), (2007, 2), (2008, 1), (2008, 2)]

непосредственно из базы данных (но не вернет все комбинации, если не в базе данных):

In [1]: from django.db import connection

In [2]: Lecture.objects.values_list('year','term').distinct()
Out[2]: [(2001, 1), (2001, 2), (2002, 1), (2002, 2), (2003, 1), (2003, 2), (2004, 1), (2004, 2)]

In [3]: connection.queries
Out[3]: 
[{'sql': u'SELECT DISTINCT "backend_lecture"."year", "backend_lecture"."term" FROM    "backend_lecture" LIMIT 21', 'time': '0.001'}]
0 голосов
/ 02 апреля 2011

Вы, вероятно, ищете комбинацию different () и values ​​().

...