2010-11-16 93 views
1

我當前正在查詢django的auth_users表以返回符合搜索條件的用戶。在Django中爲列名指定別名

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]中做的那樣;

,這樣我可以用姓名代替FIRST_NAME

感謝

+0

只是出於好奇,你爲什麼要這麼做? – aptwebapps 2010-11-16 03:28:17

+0

有一個傳統的JavaScript代碼,它使用不同的字段名稱,所以我正在考慮將列重命名爲它指向用戶對象的列。 – 2010-11-16 03:47:38

回答

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名稱會動態地出現等)。這樣你的問題就會得到更快的回答。

1

您可以註釋字段,只要你想,與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='first_name')