Наборы запросов Django - Выполнение подзапросов - PullRequest
0 голосов
/ 08 июня 2018

Как сделать запрос, чтобы все компоненты были добавлены определенным пользователем?Также в полученном объекте я хочу, чтобы имя системы и имя проекта тоже.Я видел примеры, демонстрирующие подзапросы для двух таблиц, но мне нужно это для 3 таблиц.Спасибо.

class component(models.Model):
    id = models.AutoField(primary_key=True)
    server = models.ForeignKey(server, on_delete="CASCADE")
    name = models.TextField(blank=True)
    comments = models.TextField()
    timestamp = models.DateTimeField(auto_now=True)

class system(models.Model):
    id = models.AutoField(primary_key=True)
    project = models.ForeignKey(project, on_delete="CASCADE")
    name = models.CharField(max_length=255,blank=True)
    comments = models.TextField()
    timestamp = models.DateTimeField(auto_now=True)


class project(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255,blank=True)
    comments = models.TextField()
    user = models.ForeignKey(User, on_delete="CASCADE")
    timestamp = models.DateTimeField(auto_now=True)

1 Ответ

0 голосов
/ 08 июня 2018

Нет необходимости использовать здесь подзапросы , мы можем просто выполнить объединения, просматривая внешние ключи (это обычно обозначается двумя последовательными подчеркиваниями __ в Django).

Если вы хотите, чтобы все Component, принадлежащие System, принадлежащему Project, принадлежащему user, мы можем запросить это с помощью:

from django.db.models import F

Component.objects.filter(
    <b>system__project__user=someuser</b>
).annotate(
    <b>system_name=F('system__name'),
    project_name=F('system__project__name')</b>
)

с помощью someuser пользователь, которого вы хотите фильтровать.

Компоненты в этом наборе запросов будут иметь дополнительные атрибуты system_name и project_name, которые содержат имя системы и проекта соответственно.

...