映射(应用函数)Django QuerySet

时间:2017-09-24 22:55:31

标签: django lazy-evaluation

是否存在映射Django QuerySet项而不触发其evaluation

的机制

我想知道Python map之类的东西。一个函数,它使用函数将其应用于QuerySet,但保持延迟评估。

例如,使用Django文档example中的模型,有类似的东西吗? (不是真正的代码):

>>> Question.objects.all().map(lambda q: q.pub_date + timedelta(hours=1))

保持懒惰的评价?

3 个答案:

答案 0 :(得分:0)

您可以使用values_list获取您喜欢的任何列:

Question.objects.values_list('pub_date')

这比你自己做的任何东西都简单。

答案 1 :(得分:0)

您可以为此使用注释,例如

from datetime import timedelta
from django.db.models import F, ExpressionWrapper, DateTimeField

Question.objects.annotate(
    new_pub_date=ExpressionWrapper(
       F('pub_date') + timedelta(hours=1), 
       output_field=DateTimeField()
    )
)

对于比本示例稍微复杂一点的内容,可以使用Func,Case,When

答案 2 :(得分:0)

只需自己完成类似的工作即可。我认为最好的方法是使用python列表理解。

[q.pub_date + timedelta(hours=1) for q in Question.objects.all()]

然后Django像其他查询一样负责优化此操作。