Python 在嵌套的django模型中创建查询并在django中对结果进行分组
我正试图用django ORM在我的postgresql数据库中创建查询,然后根据特定的ip地址对结果进行分组。这是我的模型: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
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'))
}