Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在嵌套的django模型中创建查询并在django中对结果进行分组_Python_Django_Postgresql - Fatal编程技术网

Python 在嵌套的django模型中创建查询并在django中对结果进行分组

Python 在嵌套的django模型中创建查询并在django中对结果进行分组,python,django,postgresql,Python,Django,Postgresql,我正试图用django ORM在我的postgresql数据库中创建查询,然后根据特定的ip地址对结果进行分组。这是我的模型: class Report(models.Model): network = models.CharField(max_length=50) timestamp = models.CharField(max_length=30) def __str__(self): return f"{self.network}_{str(sel

我正试图用django ORM在我的postgresql数据库中创建查询,然后根据特定的ip地址对结果进行分组。这是我的模型:

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\u report\u id=pk)
时,我得到特定报告中的所有端口。我的问题是,我不知道如何将所有端口与它们所属的ip地址分组。我将感谢任何有用的建议。

我们可以通过我们的查询“发送”相关
设备的
ip\u addr
ess,并在Django级别执行分组,例如:

从django.db.models导入F
从itertools导入groupby
从运算符导入吸引器
qs=Port.objects.annotate(
ip地址=F('主机ip地址')
).过滤器(
主机报告id=pk
).订购人(“ip地址”)
结果={
k:列表(vs)
对于k,vs在groupby中(qs,attrgetter('ip_addr'))
}

这里的
result
是一个
dict
字典,它将IP地址映射到相关
端口
对象的列表上。

IP地址由
主机
指定,对吗?@WillemVanOnsem yes在
k:list(vs)
中是vs变量吗?@MihaelWaschl:对不起,迭代器是
k,vs
,因此,这是元组中
groupby(…)
发出的第二项。谢谢,这是一个很好的解决方案。
from django.db.models import F
from itertools import groupby
from operator import attrgetter

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

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