Django набор запросов с частичными вложенными списками - PullRequest
1 голос
/ 14 апреля 2020

У меня есть две модели:

class Project(models.Model):
    name = models.CharField(max_length=255)
    client = models.ForeignKey(client, on_delete=models.CASCADE)

class Client(model.Model):
    name = models.CharFiled(max_length=255)

Предположим, мои данные:

Client table - [{id:1,name:client1}, {id:2, name:client2}
Project table - [{id:1, name: project1, client:1},
                 {id:2, name: project2, client:1},
                 {id:3, name: project3, client:2}]

a Client.objects.all () QuerySet вернет два объекта, client1 и client2, какой клиент 1 имеет 2 проекта, а client2 - только 1.

Я пытаюсь упорядочить QuerySet по имени проекта, но для каждого объекта Client. сделать это следующим образом:

clients = Client.objects.order_by("project__name")

как ожидается, в результате будет получено 3 объекта client, 2 для client1 и один для client 2. Это вывод:

[{id:1, name:client1, projects : [{id:1, name: project1},{id:2, name: project2}]},
[id:1, name:client1, projects : [{id:1, name: project1},{id:2, name: project2}]},
[id:2, name:client1, projects : [{id:3, name: project3}]}]

Однако мой Проблема в том, что каждый клиентский объект содержит все проекты, а не только указанный c упорядоченный.

Я пытаюсь фильтровать для каждого объекта клиента, даже если клиент совпадает только с запрошенными заказанными проектами.

Теоретически я могу сделать это вручную после получения набора запросов, но я предполагаю, что есть способ сделать это, потому что запрос знает, какой проект конкретно вызывает создание новой строки в наборе запросов.

мой ожидаемый вывод для данных данных - это набор запросов со следующими данными (которые я отправляю, кстати, сериализатору), обратите внимание, что у меня есть два объекта клиента, но с другим списком проектов, потому что order_by разбивает его. вот чего я хочу достичь:

[{id:1, name:client1, projects : [{id:1, name: project1}]},
{id:1, name:client1, projects : [{id:2, name: project2}]},
{id:2, name:client1, projects : [{id:3, name: project3}]}]

1 Ответ

0 голосов
/ 14 апреля 2020

Вы должны сделать запрос противоположным способом: получить Project s, упорядоченный по имени, с .select_related(..) на client:

projects = Project.objects<b>.select_related('client')</b>.order_by('name')

Затем для каждого Project вы можете получить клиент с .client. Это более эффективно, но и более разумно, поскольку вы по сути обрабатываете список проектов с подключенным к нему клиентом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...