2011-04-02 1 views
2

J'ai ce modèle Django:Obtenez toutes les combinaisons disponibles de deux champs à travers l'ORM 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 peut être soit 1 ou 2 (printemps ou automne). Maintenant, je veux lister tous les termes pour lesquels il y a des conférences, par ex. quelque chose comme ((2007, 2), (2008, 1), (2008, 2), (2009, 1), (2009, 2), (2010, 1)). La liste n'a pas besoin d'être triée. Est-il possible de générer cette liste à travers l'ORM efficacement? La meilleure solution que je trouve est:

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

Mais cet appel ORM retourne encore un résultat pour chaque Lecture et réduit en Python, il pourrait se développer lentement avec un grand nombre de Lecture s.

Répondre

5

Si vous avez toutes les données dans la base de données, alors cela fonctionnera. mais si les données ne sont pas là, vous devriez les générer vous-mêmes.

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)] 

directement à partir de la base de données (mais ne reviendra pas toutes les combinaisons sinon dans la base de données):

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

Désolé, mais cela n'aide pas vraiment. Je veux seulement lister les termes qui ont des conférences dans la base de données. Mon interlocuteur dans la question le fait, quoique inefficacement. Ce que je cherche, c'est un appel ORM efficace qui me donne le même résultat. –

+0

a mis à jour ma réponse – Jerzyk

Questions connexes