2010-05-05 6 views
1

jusqu'à présent j'avoir cette requête:comment puis-je regrouper les valeurs converties?

q = Foobar.objects.values('updater','updated') 
q = q.annotate(update_count=Count("id")) 

qui semble générer une requête comme:

select updater, updated, count(id) 
from foobar 
group by updater, updated 

« mis à jour » est un champ date-heure, et je voudrais faire mes comptes par jour, avec une requête qui ressemble à:

select updater, cast(updated as date), count(id) 
from foobar 
group by updater, cast(updated as date) 

est-il un moyen de le faire avec l'API de requête, ou dois-je laisser tomber en arrière à SQL brute?

Répondre

0

Django ne supporte pas ce niveau de contrôle sur les requêtes de base de données - genres En effet, vous ne pouvez pas faire de requêtes avec des fonctions comme CAST.

Vous avez cependant quelques options dans ce cas. Tout d'abord, le plus simplement, vous pouvez simplement prendre l'objet datetime renvoyé par l'objet ORM et supprimer la précision supplémentaire en utilisant datetime.replace().

Une autre option, si vous savez que vous ne voulez que votre application Django à utiliser toute précision sur le terrain mis à jour au-delà de la journée, est de définir simplement updated dans votre models.py comme models.DateField() par opposition à models.DateTimeField(). Cela signifie que les données retournées par le modèle ORM n'auront jamais de précision au-delà du jour.

Enfin, je suppose que vous utilisez le plus récent Django (1.1), mais dans Django 1.2 (prévue pour le 10 mai), vous serez en mesure de faire ce qui suit:

Foobar.objects.raw("select updater, cast(updated as date), count(id) from foobar group by updater, cast(updated as date)")

Le résultat (en supposant qu'il a le même nombre de colonnes et de types de colonnes que ce que vous avez défini dans votre modèle Foobar) sera un Queryset ORM django normal.

0

QuerySet.dates() (http://docs.djangoproject.com/en/dev/ref/models/querysets/#dates-field-kind-order-asc) vous participe du chemin, mais il ne semble pas jouer agréable avec .values() et faire un GROUP BY (j'ai essayé pendant quelques minutes). Peut-être vous avez déjà vu que de toute façon ...

Mais il montre que Django a déjà une fonction SQL que vous aurez besoin si vous écrivez votre propre version SQL:

print(ProcessingState.objects.dates('timestamp', 'day').query) 

rendements

SELECT DISTINCT django_date_trunc("day", "databot_processingstate"."timestamp") 
    FROM "databot_processingstate" ORDER BY 1 ASC 

(désolé pour les noms de table étranges et des choses, il est juste mon propre modèle que je happend d'avoir à portée de main)

Questions connexes