【问题标题】:Selecting all columns from related model with django queryset使用 django 查询集从相关模型中选择所有列
【发布时间】:2016-05-23 15:31:50
【问题描述】:

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

Project
| - Employee
| - Task

Employee 和 Task 通过 ForeignKey 字段与 Project 相关联。

我能够使用原始方法获取我正在寻找的数据:

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 从相关模型中选择所有列?

【问题讨论】:

    标签: python django


    【解决方案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)
    

    【讨论】:

    • 这只会从 Project 对象中提取值,而不是从员工或任务模型中提取值。
    【解决方案2】:

    找到了一种编程方式来执行此操作。查询每个表的元数据,构建一个可以传递给 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-16
      • 2020-03-05
      • 1970-01-01
      • 2020-11-14
      • 2020-07-31
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多