是否存在映射Django QuerySet项而不触发其evaluation?
的机制我想知道Python map之类的东西。一个函数,它使用函数将其应用于QuerySet,但保持延迟评估。
例如,使用Django文档example中的模型,有类似的东西吗? (不是真正的代码):
>>> Question.objects.all().map(lambda q: q.pub_date + timedelta(hours=1))
保持懒惰的评价?
答案 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像其他查询一样负责优化此操作。