使用django queryset从相关模型中选择所有列

时间:2016-05-23 15:31:50

标签: python django

我有一个django应用程序,我希望从三个模型中选择每一列。

Project
| - Employee
| - Task

员工和任务通过ForeignKey字段与Project相关。

我可以使用raw方法获取我正在寻找的数据:

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加载到pandas中并不是开箱即用的。

我需要选择100个列,并将所有这些列手动输入Project.objects.values( ... )非常混乱。如何使用django的QuerySet API从相关模型中选择所有列?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

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)

答案 1 :(得分:0)

找到了一种编程方式来实现这一目标。查询每个表的元数据,以构建一个可以传递给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)