这段代码很好用。但它很慢。所以我想重构以下代码。
from django.template.defaultfilters import date
json_resp = []
actions = Model.objects.all().select_related('user')
for action in actions:
json_resp.append({
'user': some_custom_function(user),
'created_at': date(action.created_at, 'U')
})
return HttpResponse(json.dumps(json_resp), content_type='application/json')
def some_custom_function(user):
# return anonymous if there's no first name.
if not user.first_name:
return u'Anonymous'
# if not last name, return first name.
if not user.last_name:
return u'{}'.format(user.first_name)
# I can't use get_full_name().
return u'{0} {1}.'.format(user.first_name, user.last_name[:1])
重构代码
actions = Model.objects.all().select_related('user').values(
'user',
'created_at'
).order_by('-created_at')
但是有一个问题。如果我想用字段执行其他功能怎么办?我可以使用values()
吗?
就像我在第一部分所做的那样。 'created_at': date(action.created_at, 'U')
。
还有更好的方法吗?非常感谢。
修改:我可以在javascript中移动some_custom_function
功能。我只关注date
过滤器。我想我可以使用extra()
答案 0 :(得分:0)
您可以在__
方法中使用values()
关系。要使用values_list()
代替值来增加速度,请减少格式代码并切换到列表理解:
from datetime import datetime
def full_name(first_name, last_name):
if not first_name:
return u'Anonymous'
if not last_name:
return first_name
return u'{0} {1}.'.format(first_name, last_name[:1])
def seconds_since_epoch(time):
return int(time - datetime(1970, 1, 1)).total_seconds())
...
actions = Model.objects.all().select_related('user').values_list(
'user__first_name', 'user__last_name', 'created_at'
).order_by('-created_at')
json_resp = [{'user': full_name(first_name, last_name),
'created_at': seconds_since_apoch(created_at)}
for fist_name, last_name, created_at in actions]