12
votes

Différence globale entre les champs DateTime à Django

J'ai une table contenant une série d'entrées qui concernent des périodes de temps (spécifiquement, le temps travaillé pour un client): xxx pré>

J'essaie de regrouper tout le temps travaillant pour une donnée. Client, de mon application Django: p> xxx pré>

Cela semble inélégant, mais il fonctionne em>. Ou au moins alors je pensais: il s'avère que cela fonctionne bien sur une base de données PostgreSQL, mais lorsque je passe à Sqlite, tout meurt. P>

Un peu de creusement suggère que la raison en est que Code> DateTime CODE> S n'est pas des données de première classe dans SQLite. La requête SQLITE crue suivante fera mon travail: P>

sum([task_time.end_date - task_time.start_date for task_time in models.TaskTime.objects.filter(...)])
  • L'échantillon Python ci-dessus semble rond-point. Pouvons-nous le faire plus élégamment? LI>
  • Plus important encore à ce stade, pouvons-nous le faire d'une manière qui fonctionnera sur Postgres et SQLite? Idéalement, j'aimerais ne pas écrire des requêtes SQL crues et la mise sous tension de la base de données qui se trouve être en place; Dans Général em>, Django est extrêmement bon pour nous protéger de cela. Django a-t-il une abstraction raisonnable pour cette opération? Sinon, qu'est-ce qui est un moyen raisonnable de faire un commutateur conditionnel sur le backend? Li> ul>

    Je devrais mentionner pour le contexte que l'ensemble de données est à plusieurs milliers d'entrées; Ce qui suit n'est pas vraiment pratique: p> xxx pré> p>


0 commentaires

3 Réponses :


-2
votes

Django ne prend actuellement que prend en charge les agrégats pour min, max, avg et compter, il est donc le seul moyen de réaliser ce que vous voulez. Lorsque vous utilisez RAW SQL, la base de données-Indépendance est sortie de la fenêtre, alors malheureusement, vous n'avez pas de chance. Vous devrez simplement détecter la base de données et modifier correctement le SQL.


1 commentaires

N'est plus une réponse valide



10
votes

Je pense depuis Django 1.8 Nous pouvons faire mieux:

Je voudrais juste dessiner la pièce avec annotation, la partie supplémentaire avec agrégation doit être simple: xxx

[Plus sur la fonction d'âge des postgres ici: http: //www.postgresql. org / docs / 8.4 / statique / fonctions-DateTime.html ]

Chaque instance de SOMEMODEL sera anotée avec Durée Différence temporelle de champ, qui dans Python Soyez un DateTime.Timedelta () Objet [plus sur DateTime TimeDelta Ici: https://docs.python.org/2/library/dateTime.html#timedelta-Objects ]


1 commentaires

Très impressionnant. Merci.