在Django中为列名指定别名

Pra*_*arg 6 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')
Run Code Online (Sandbox Code Playgroud)

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

这样我就可以使用firstname代替first_name来访问它

谢谢

use*_*558 6

您可以根据需要使用F表达式注释字段:

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'))
Run Code Online (Sandbox Code Playgroud)


Mar*_*row 0

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

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

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

User.objects.filter(
    Q(**{
        translate(js_firstname) + '_icontains': name
    }) ...
Run Code Online (Sandbox Code Playgroud)

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

PS 我希望这能最好地回答你的问题。将来我建议您提供问题的上下文(即指定您遇到此问题是因为...,并且 javascript 名称动态显示等)。这样您的问题将得到更快的解答。