与Queryset值相关()

时间:2015-01-16 10:29:34

标签: python django

这段代码很好用。但它很慢。所以我想重构以下代码。

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()

1 个答案:

答案 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]