【发布时间】:2020-05-27 14:49:21
【问题描述】:
我有一个模型如下:
class NetworkDevice(models.Model):
name = models.CharField(max_length=30)
class NetworkInterface(models.Model):
intname = models.CharField(max_length=30)
device = models.ForeignKey(NetworkDevice)
class NetworkMac(models.Model):
macaddr = models.CharField(max_length=30)
interface = models.ManyToManyField(NetworkInterface)
我想创建一个设备详细信息页面,该页面仅显示从分配给该特定设备的接口中获知的 MAC。问题是相同的mac地址存在于不同设备上的不同接口上。如果我传递我的模板,例如:
macs = NetworkMac.objects.filter(interface__device__name='<some device name>')
这样做会为我提供该设备的所有 MAC 地址,但由于 MAC 是共享的,因此它还会为我提供与其他设备上的接口关联的 MAC。因此,当我尝试在我的模板中显示它时,它最终什么也没给我,或者如果我使用 |first,它通常会根据设备添加到数据库的顺序为我提供不同设备的界面。
我真正需要的是一个我可以运行的查询,它将返回单个设备的所有 mac,仅在与所述设备关联的接口上学习。
更新: 只是为了提供更多细节。我现在解决这个问题的方法是在我的视图中定义一个方法,就像这样......
class DeviceDetailView(generic.DetailView):
template_name = 'NetViewer/Device_detail_template.html'
model = NetworkDevice
def mac_ip_table(self, device_pk):
ints = NetworkInterface.objects.filter(hostdevice__hostname=device_pk.hostname)
mac_list = []
for int in ints:
for mac in int.networkmacs.all():
ip_qs = NetworkIP.objects.filter(mac__macaddr=mac.macaddr)
ip_list = [ip.ip for ip in ip_qs]
mac_list.append(tuple([mac.macaddr, ip_list, int.intname]))
return mac_list
def get(self, request, *args, **kwargs):
device = NetworkDevice.objects.get(pk=self.kwargs.get('pk'))
args = {'macs': self.mac_ip_table(device), 'device': device}
return render(request, self.template_name, args)
然后我循环遍历模板中 mac_ip_table 返回的内容。这样做的缺点是它的效率非常低,并且可能会使分页变得不可能。
当我跳过多个模型时,例如...
macs = NetworkMac.objects.filter(interface__hostdevice__hostname=device_pk.hostname)
我需要一种方法来仅针对与设备关联的接口过滤此查询。我对 Django 比较陌生,所以如果这个问题完全偏离基础或者我完全错过了一些东西,请不要伤害我
【问题讨论】:
-
我想我不明白你的问题。您能否提供示例数据以及您想要的结果?
-
查询
macs = NetworkMac.objects.filter(interface__device__name='<some device name>')返回该设备的 mac 查询集,但是除了我正在过滤的设备之外,其中一些相同的 mac 还链接到其他设备(因为许多-太多)。我想运行一个过滤设备名称的查询,并且只过滤链接回该设备的接口。我希望这是有道理的
标签: django django-models django-templates foreign-keys many-to-many