2016-05-23 72 views
0

我有一個django應用程序,我正在尋找從三個模型中選擇每一列。用django查詢集選擇相關模型中的所有列

Project 
| - Employee 
| - Task 

員工和任務通過ForeignKey字段與項目相關。

我能夠得到我正在尋找使用原始方法的數據:

SELECT * 
FROM "Project" 
LEFT OUTER JOIN "Employee" ON "Employee"."project_id" = "Project"."id" 
LEFT OUTER JOIN "Task" ON "Task"."project_id" = "Project"."id"; 

然而,得到了數據備份,我希望用django_pandas後,因爲有一些數字處理這需要在數據作爲csv返回之前發生。將RawQuerySet加載到熊貓中並不適用。

我需要選擇> 100列,並將其全部手動輸入Project.objects.values(...)相當混亂。如何使用django的QuerySet API從相關模型中選擇所有列?

回答

1

你可以這樣做:

projects = Project.objects.prefetch_related('employee_set', 'task_set').all() 

而且對於相關領域(已預取):

employees_on_projects = [project.employee_set.values() for project in projects] 
tasks_in_projects = [project.task_set.values() for project in projects] 

你可以擁有所有的員工和任務內襯各自項目通過做:

data = zip(projects.values(), employees_on_projects, tasks_in_projects) 

它應該與您的數據幀一起工作:

import pandas as pd 
df = pd.DataFrame.from_records(data) 
+0

這隻會從Project對象中獲取值,而不是從員工或任務模型中獲取值。 – DataSwede

+0

檢查更新... –

0

找到一個編程方式來做到這一點。查詢每個表的meta,構建一個可以傳遞給values方法的巨大列表。

query_set_fields = [] 
project_fields = Project._meta.get_fields() 
for i in project_fields: 
    query_set_fields.append(i.name) 

employee_fields = Employee._meta.get_fields() 
for i in employee_fields: 
    query_set_fields.append(i.name) 

task_fields = Task._meta.get_fields() 
for i in task_fields: 
    query_set_fields.append(i.name) 

qs = Project.objects.values(*query_set_fields) 
df = pd.DataFrame.from_records(qs) 
相關問題