【发布时间】:2018-10-15 20:09:18
【问题描述】:
我有两个模型,Project 和 Session。一个项目有很多会话,一个用户有很多项目:
class Project(models.Model):
class Meta:
ordering = [models.functions.Lower("name")]
name = models.CharField(max_length=255)
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Session(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
timezone = TimeZoneField()
breaks = models.IntegerField(default=0, validators=[MinValueValidator(0)])
project = models.ForeignKey(Project, on_delete=models.CASCADE)
def duration(self):
# returns minutes in (end - start)
我想要一种方法来获取给定用户的所有项目,按其所有会话的持续时间总和排序。由于session.duration() 不是数据库字段,而是根据数据库字段计算得出,因此我无法在单个数据库查询中获取此信息。
我目前的解决方案是:
sessions = Session.objects.filter(project__user=self)
groups = [[a, sum([s.duration() for s in b])] for a, b in groupby(
sessions, key=lambda s: s.project
)]
groups = sorted(groups, key=lambda g: g[1], reverse=True)
return [g[0] for g in groups]
这会在一个查询中获取所有相关会话,但随后我按项目对它们进行分组,这需要很长时间 - 当有大约 100 个项目时大约需要一秒钟。有没有一种方法可以减少时间?理想情况下,不需要为每个项目调用数据库?
我正在使用 Django 2.0。
【问题讨论】:
标签: django database django-orm