2017-12-18 87 views
0

我在models.py類中有一些函數。目前在導出類中提到了所有的字段。我想導出所有的函數字段,而不是提及每一個增加我的代碼行的特定字段。有辦法我可以做到嗎? 下面是導出功能的代碼示例導出導出函數中的所有函數以生成xlsx

def export_xlsx(self, request, queryset): 
list_dict = [] 
idx = 0 
for q in queryset: 

    list_dict += [{}] 
    list_dict[idx]['name'] = q.name 
    list_dict[idx]['place'] = q.place 
    list_dict[idx]['time'] = q.time 
    list_dict[idx]['date'] = q.date 
    list_dict[idx]['country'] = q.country 
    list_dict[idx]['city'] = q.city 

    idx += 1 
h = [ 
    'name', 
    'place', 
    'time', 
    'date', 
    'country', 
    'city'] 
gen_xlsx("export_file", h, list_dict, request) 
return request 

回答

0

Django的查詢集有一個value()方法產生{fieldname:fieldvalue}類型的字典,而不是模型實例,所以假設你不要指望,以獲取相關的模型值,這應該解決您的問題:

for q in queryset.values(): 
    # your code here 

,如果你需要從相關對象的值,那麼你就必須將所有所需的字段名傳遞給values,使用"relatedfield__fieldname"語法(用於與查找相同)相關對象的字段 - 也就是說,如果country實際上是一個foreign_key到Country模型與name領域,你想在你的結果國名,你將需要:

fields = ["name", "place", "date", "time", "country__name", "city") 
for q in queryset.values(*fields): 
    # your code here 

而且(無關,但是......),你將項目添加到您的方式列表無用地複雜(並且不是很有效)。你可以只建立自己的字典,並把它添加到列表中:

# awful name FWIW... what about 'records' or 'rows' or, 
# well, something meaningful ? 
list_dict = [] 

for q in queryset: 
    d = dict(name=q.name, place=q.place, time=q.time, #etc) 
    list_dict.append(d) 

這可以進一步改進成一個列表表達式:

list_dict = [ 
    dict(name=q.name, place=q.place, time=q.time, #etc) 
    for q in qs 
    ] 

但由於queryset.values()已經產生類型的字典,你真正需要的其實是:

fields = ["name", "place", "date", "time", "country", "city") 
list_dict = list(queryset.values(*fields)) 
+0

@Ressaq這是另一個問題,並沒有足夠的上下文來回答它。請將它作爲新問題發佈,並附帶您可能需要的「驗證」示例。另外,解釋一下你是否在尋找一個通用的答案(只適用於任何模型的代碼)或特定的答案(在這種情況下,發佈模型代碼,查詢等)。 –