在Django中指定列名的别名

时间:2010-11-16 03:11:15

标签: django django-models

我目前正在查询django的auth_users表,以返回符合搜索条件的用户。

users = User.objects.filter(
      Q(first_name__icontains = name)| 
      Q(username__icontains = name) | 
      Q(email__icontains = name) | 
      Q(last_name__icontains = name)
   ).values(
      'id', 'username', 'first_name', 'last_name', 'email'
   ).order_by('first_name')

我想知道我是否可以将'first_name'的名称更改为'firstname'? 就像我们可以在SQL [Select first_name as firstname from auth_users];

中做的那样

这样我就可以使用firstname而不是first_name

来访问它

由于

2 个答案:

答案 0 :(得分:5)

您可以使用F expression

按需添加字段
from django.db.models import F

users = User.objects.filter(
      Q(first_name__icontains = name) | 
      Q(username__icontains = name) | 
      Q(email__icontains = name) | 
      Q(last_name__icontains = name)
   ).values(
      'id', 'username', 'first_name', 'last_name', 'email'
   ).order_by('first_name'
   ).annotate(firstname = F('first_name'))

答案 1 :(得分:0)

我会在两个名称空间之间创建一个转换层。由于您使用的是Django ORM并且JavaScript代码是遗留的,我认为您可能希望在Python中执行此操作。

def translate(js_column_name):
    return {
        'firstname': 'first_name',
    }.get(js_column_name, 'string to return when not found')

使用此翻译功能,您可以在字典中创建关键字参数,然后使用Q将其传递给**函数:

User.objects.filter(
    Q(**{
        translate(js_firstname) + '_icontains': name
    }) ...

当然我假设您不会知道您要翻译的输入是'firstname',否则您可以定义正确的列名而无需执行此操作(即只是正常创建查询)。所以我假设您正在动态地接收JavaScript列名称,在这种情况下,我会使用这种方法。

P.S。我希望这能最好地回答你的问题。将来我建议你为你的问题提供一个上下文(即指明你有这个问题,因为......,以及javascript名称动态出现等)。这样你的问题就会得到更快的回答。