我有一个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从相关模型中选择所有列?
答案 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)