Django多对多多重过滤

Django多对多多重过滤,django,django-models,django-templates,foreign-keys,many-to-many,Django,Django Models,Django Templates,Foreign Keys,Many To Many,我有一个模型如下: 类网络设备(models.Model): name=models.CharField(最大长度=30) 类网络接口(models.Model): intname=models.CharField(最大长度=30) 设备=型号。外键(网络设备) 类NetworkMac(models.Model): macaddr=models.CharField(最大长度=30) 接口=模型.ManyToManyField(网络接口) 我想创建一个设备详细信息页面,该页面只显示从分配给该特定

我有一个模型如下:

类网络设备(models.Model):
name=models.CharField(最大长度=30)
类网络接口(models.Model):
intname=models.CharField(最大长度=30)
设备=型号。外键(网络设备)
类NetworkMac(models.Model):
macaddr=models.CharField(最大长度=30)
接口=模型.ManyToManyField(网络接口)
我想创建一个设备详细信息页面,该页面只显示从分配给该特定设备的接口中学到的MAC。问题是相同的mac地址在不同的设备上使用不同的接口。如果我传递模板,如下所示:

macs=NetworkMac.objects.filter(接口设备名称=“”)
这样做会为我提供该设备的所有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\u ip\u表
。这样做的缺点是效率很低,可能会使分页变得不可能

当我浏览多个模型时,例如

macs=NetworkMac.objects.filter(接口\uuuuhostdevice\uuuuhostname=device\upk.hostname)

我需要一种方法来过滤这个查询,只针对与设备相关联的接口。我对Django还比较陌生,所以如果这个问题完全不正确或者我完全遗漏了什么,请不要伤害我。这应该是有用的:

 macs = NetworkMac.objects.filter(interface__exact='<some device name>')
macs=NetworkMac.objects.filter(接口\uu精确=“”)

我想我不理解你的问题。您可以提供示例数据以及所需结果吗?查询
macs=NetworkMac.objects.filter(interface\uu device\uu name='')
返回该设备的mac查询集,但除了我正在筛选的设备外,这些mac中的一些还链接到其他设备(因为多对多)。我想运行一个查询,对设备名称进行过滤,只对链接回该设备的接口进行过滤。我希望这是有道理的