【问题标题】:Django many-to-many multiple filteringDjango多对多多重过滤
【发布时间】: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='&lt;some device name&gt;') 返回该设备的 mac 查询集,但是除了我正在过滤的设备之外,其中一些相同的 mac 还链接到其他设备(因为许多-太多)。我想运行一个过滤设备名称的查询,并且只过滤链接回该设备的接口。我希望这是有道理的

标签: django django-models django-templates foreign-keys many-to-many


【解决方案1】:

这应该很有用:

 macs = NetworkMac.objects.filter(interface__exact='<some device name>')

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 2016-06-19
    • 1970-01-01
    • 2018-06-07
    • 2012-09-26
    • 2015-07-18
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多