Django: Query mit Join, Summe und Filter auf DateField
Verfasst: Sonntag 11. Dezember 2011, 12:39
Hallo Forum,
ich bin gerade dabei eine kleine Anwendung auf Django umzustellen.
Ich muss ehrlich zugeben, dass ich das ORM-System, vor allem den Syntax, sehr gewöhnungsbedürftig finde. Obwohl ich schon eine Weile mit Django herum spiele werde ich damit irgendwie nicht warm.
Ich würde gerne folgende Query in Django abbilden:
Die Definition der Modelle ist relativ simpel:
Schon bei dem Versuch die Summe aller ausgeführten Tasks zu bekommen schlägt fehl:
Ja, ok, ich will aber nicht eines von den Feldern in der Tabelle aggregieren, sondern eines der Felder in den verbundenen Tabellen.
Kann mir da jemand auf die Sprünge helfen?
Gruß
Sparrow
ich bin gerade dabei eine kleine Anwendung auf Django umzustellen.
Ich muss ehrlich zugeben, dass ich das ORM-System, vor allem den Syntax, sehr gewöhnungsbedürftig finde. Obwohl ich schon eine Weile mit Django herum spiele werde ich damit irgendwie nicht warm.
Ich würde gerne folgende Query in Django abbilden:
Code: Alles auswählen
SELECT member.name, member.description, SUM(task.value) AS valuesum
FROM contrib LEFT JOIN member ON (contrib.member = member.id)
LEFT JOIN task ON (contrib.task = task.id)
WHERE contrib.done >= "01.01.2011"
GROUP BY member.name, member.description
ORDER BY valuesum;
Code: Alles auswählen
class Member(models.Model):
name = models.CharField(max_length = 50)
description = models.TextField()
class Task(models.Model):
name = models.CharField(max_length = 50)
description = models.TextField()
value = models.IntegerField()
class Contrib(models.Model):
member = models.ForeignKey(Member)
task = models.ForeignKey(Task)
done = models.DateField()
Code: Alles auswählen
>>> from psystem.psys.models import Contrib
>>> from django.db.models import Sum
>>> test = Contrib.objects.all().aggregate(total=Sum('task.value'))
FieldError: Cannot resolve keyword 'task.value' into field. Choices are: done, id, member, task
Kann mir da jemand auf die Sprünge helfen?
Gruß
Sparrow