Создание запроса во вложенной модели django и группирование результатов в django - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь создать запрос в моей базе данных postgresql с помощью django ORM, а затем сгруппировать результаты по конкретному ip_addr.Вот мои модели:

class Report(models.Model):
    network = models.CharField(max_length=50)
    timestamp = models.CharField(max_length=30)

    def __str__(self):
        return f"{self.network}_{str(self.timestamp)}"


class Device(models.Model):
    report = models.ForeignKey(Report, on_delete=models.CASCADE)
    ip_addr = models.GenericIPAddressField()
    mac_addr = models.CharField(max_length=20)
    date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.ip_addr


class Port(models.Model):
    host = models.ForeignKey(Device, on_delete=models.CASCADE)
    port = models.IntegerField()
    status = models.CharField(max_length=15)
    application = models.CharField(max_length=100)

    def __str__(self):
        return str(self.port)

Когда я выполняю запрос Port.objects.filter(host__report_id=pk), я получаю все порты в конкретном отчете.Моя проблема в том, что я не знаю, как сгруппировать все порты с ip_addr, к которому они принадлежат.Буду признателен за любые полезные советы.

1 Ответ

1 голос
/ 10 мая 2019

Мы можем "отправить" ip_addr ess связанных Device с помощью нашего запроса и выполнить группировку на уровне Django, например, с помощью itertools.groupby,например:

from django.db.models import <b>F</b>
from itertools import <b>groupby</b>
from operator import <b>attrgetter</b>

qs = Port.objects.annotate(
    <b>ip_addr=F('host__ip_addr')</b>
).filter(
    host__report_id=pk
).order_by(<b>'ip_addr'</b>)

result = {
    k: list(vs)
    for k, vs in groupby(qs, attrgetter('ip_addr'))
}

Здесь result - это dict ionary, который отображает IP-адреса в списке связанных Port объектов.

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