Trong thiết lập sau, tôi muốn một QuerySet có một danh sách các dự án, mỗi chú thích với tổng của tất cả các thời gian nhiệm vụ của nó (như tasks_duration) và tổng của tất cả các nhiệm vụ của nó ' subtask duration (như subtasks_duration). Mô hình của tôi (giản thể) trông như thế này:nhiều chú thích Cụm từ tổng sản lượng trả lời tăng cao
class Project(models.Model):
pass
class Task(models.Model):
project = models.ForeignKey(Project)
duration = models.IntegerField(blank=True, null=True)
class SubTask(models.Model):
task = models.ForeignKey(Task)
duration = models.IntegerField(blank=True, null=True)
tôi làm cho QuerySet của tôi như thế này:
Projects.objects.annotate(tasks_duration=Sum('task__duration'), subtasks_duration=Sum('task__subtask__duration'))
Liên quan đến hành vi được giải thích trong Django annotate() multiple times causes wrong answers tôi nhận được một tasks_duration đó là cao hơn nhiều so với nó nên được. Các mệnh đề nhiều chú thích (Sum()) mang lại nhiều phép nối bên trong bên trái trong SQL kết quả. Chỉ với một cụm từ chú thích (Sum()) duy nhất cho task_duration, kết quả là chính xác. Tuy nhiên, tôi muốn có cả task_duration và subtasks_duration.
Cách thích hợp để thực hiện truy vấn này là gì? Tôi có một giải pháp làm việc cho mỗi dự án, nhưng đó là chậm trễ đáng ngạc nhiên. Tôi cũng có một cái gì đó tương tự làm việc với một cuộc gọi thêm(), nhưng tôi thực sự muốn biết nếu những gì tôi muốn là có thể với Django tinh khiết.
Bạn đã thử 'tasks_duration = Sum ('task__duration', khác biệt = True), subtasks_duration = Sum ('task__subtask__duration', khác biệt = True) 'như được đề cập trong câu hỏi khác mà bạn đã liên kết? – jpic
Điều đó sẽ chỉ phục vụ để tính các giá trị thời lượng riêng biệt, không phải là những gì tôi muốn. Trong tò mò tôi đã thử nó, vẫn mang lại giá trị không chính xác. (các khoảng thời gian khác nhau) –
Bao giờ tìm thấy một giải pháp cho việc này? Tôi đang cố gắng để chú thích một tổng và đếm trên một queryset, và số tiền tiếp tục nhận được nhân ... – StephenTG