gpt4 book ai didi

python - 在嵌套的 Django 模型中创建查询并将结果分组到 Django 中

转载 作者:行者123 更新时间:2023-11-29 13:10:06 25 4
gpt4 key购买 nike

我正在尝试使用 django ORM 在我的 postgresql 数据库中创建查询,然后按特定的 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 分组。我将不胜感激任何有用的建议。

最佳答案

我们可以使用我们的查询“传送”相关设备ip_address,并在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 是一个 dictionary,它将 IP 地址映射到相关 Port 对象的列表中。

关于python - 在嵌套的 Django 模型中创建查询并将结果分组到 Django 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56083649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com