2016-05-23 4 views
0

У меня есть приложение django, где я хочу выбрать каждый столбец из трех моделей.Выбор всех столбцов из родственной модели с помощью django queryset

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 в pandas не работает из коробки.

Существует> 100 столбцов, которые мне нужно выбрать, и ввод всех их вручную в Project.objects.values(...) довольно грязный. Как выбрать все столбцы из связанной модели с помощью API QuerySet 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) 
+0

Это только вытаскивает значения из объекта Project, а не из сотрудника или из моделей задач. – DataSwede

+0

Проверить обновления ... –

0

Нашел программный способ сделать это. Запросите мета для каждой таблицы, чтобы создать гигантский список, который можно передать методу значений.

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) 
Смежные вопросы