我有这个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而变慢。
答案 0 :(得分:5)
如果您拥有数据库中的所有数据,那么它将起作用。但如果数据不存在,你应该自己生成。
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'}]
答案 1 :(得分:0)
您可能正在寻找distinct()和值()的组合。