2010-02-01 11 views
0

J'ai un modèle d'article avec un champ de date. Je veux interroger tous les objets article, et avoir un type de données retourné avec chaque année distincte, puis chaque mois distinct à l'intérieur de cela.Tri et regroupement d'objets par Date avec l'ORM Django

par exemple

archives = { 2009: {12, [, , ...], 11: [...]}, 2008: {12, [...], 11: [...]}, }

est-ce possible?

+0

J'ai une idée de créer un nouveau champ à l'aide requête MySQL brut (smth comme YYYY_MM) et après cela, utilisez 'map' pour remplir la variable archives. –

Répondre

0

Il n'existe pas de solution rapide, mais vous pouvez vérifier la méthode dates().

+0

Par exemple, si vous le souhaitez pour le mois, '[(date, Model.objects.filter (pub_date__year = date.year, pub_date__month = date.month)) pour date dans Model.objects.dates ('pub_date', 'mois ')] 'vous obtiendra une liste de tuples' (date, QuerySet) 'pour chaque mois (en supposant que votre champ s'appelle' pub_date'). – LeafStorm

4

Ce genre de question semble arriver assez souvent. La solution la plus simple consiste à parcourir les données et à regrouper les objets par année et par mois. Vous pouvez le faire à la main dans la vue ou en utilisant regroup dans votre modèle. Cela dépend vraiment de ce que vous voulez faire avec les données.

Si le regroupement d'archives par année et par mois est une opération très courante dans votre application, vous pouvez envisager de créer un champ d'année et de mois que vous remplissez dans save().

À la main, il pourrait être quelque chose comme ceci:

arch = {} 
for a in Archive.objects.all(): 
    year = arch.get(a.pub_date.year, {}) 
    month = year.get(a.pub_date.month, []) 
    month.append(a) 
    year[a.pub_date.month] = month 
    arch[a.pub_date.year] = year 

Ou pousser toute la logique de regroupement dans le modèle à l'aide regroup (non testé):

{% regroup archives by pub_date.year as year_list %} 
{% for year in year_list %} 
    Year: {{ year.grouper }} 
    {% regroup year.list by pub_date.month as month_list %} 
    {% for month in month_list %} 
    Month: {{ month.grouper }} 
    {% for archive in month.list %} 
     {{ archive }} 
    {% endfor %} 
    {% endfor %} 
{% endfor %} 

Je voudrais essayer personnellement de mettre la logique dans la vue au lieu de dans le modèle.

Voici quelques messages connexes: