【发布时间】:2011-05-25 12:32:12
【问题描述】:
所以,我有一个 Person 模型,然后我有一个模型名称 Carusage。 Carusage 的相关部分是这样的:
class Carusage(models.Model):
person = models.ForeignKey(Person)
start = models.DateTimeField()
end = models.DateTimeField(null=True, blank=True)
Person 可以坐车,然后系统会创建一个新的 Carusage 实例并将其保存为 start 作为当前时间。然后当 Person 还车时,保存当前时间结束。
现在,在我的代码中,我有一个 Person 模型列表,我想在 Carusage 中检索每个 Person 的最新日期。因此,如果一个人刚刚还车,我想要与那个人相关联的最新 Carusage 的结束字段,如果这个人还有车,我想要开始字段。
最好我想在一个 SQL 语句中执行此操作,因为我的个人列表可能会变得非常大(下限~10,上限~10.000)。我试过这样的事情:
Carusage.objects.filter(person__in(person_list)).exclude(start__gte(time_now))
然后正在考虑注释,但想不出我将如何进行。
所以目前我正在这样做:
time_now = datetime.datetime.now()
time_list = []
for p in person_list:
latest = Carusage.objects.filter(person=p).exclude(start__gte=time_now).only('start', 'end').latest('start')
try:
if latest.end<time_now:
time=latest.end
else:
raise
except:
time=latest.start
time_list.append(time)
显然我的代码运行速度很慢(500 人列表大约需要 5 秒)。运行这个/这些查询的“django 方式”是什么? 我想实现两件事:只为 Carusage 打一次数据库(至少不是 len(person_list) 次)并且只从数据库中获取相关时间(只需要最新的时间......)。 有什么方法可以实现吗?
【问题讨论】:
标签: python django django-models django-queryset