Skip to main content
 首页 » 编程设计

python之无法在 Django 中引用相关的多对多对象

2024年08月13日46hnrainll

这是我的模型:

class Vlan(models.Model): 
    Name = models.CharField(max_length=20) 
    VID = models.IntegerField(default=1) 
    def __str__(self): 
        return(str(self.VID) + ' ' + self.Name) 
 
 
class Connection(models.Model): 
    Description = models.CharField(max_length=80) 
    Created = models.DateTimeField('Created Date') 
    Change_Order = models.CharField(max_length=40) 
    Implemented_by = models.CharField(max_length=80) 
    def __str__(self): 
        return(self.Description) 
 
class Port(models.Model): 
    Port_Number = models.IntegerField(default=1) 
    Is_Pri = models.BooleanField(default=True) 
    Switch = models.ForeignKey(Switch, on_delete=models.CASCADE) 
    Connection = models.ForeignKey(Connection, null=True, blank=True, on_delete=models.SET_NULL) 
    Vlans = models.ManyToManyField(Vlan,  blank=True) 
    def __str__(self): 
        return(str(self.Port_Number)) 

每个连接可以有一个或多个端口,每个端口可以有一个或多个vlan(一个vlan可以在一个或多个端口上)。

我正在尝试创建一个字典列表以在模板中呈现。每个字典都包含一个端口对象列表。每个端口对象都包含一个包含 VLAN 对象的字典列表。

但我无法查询一组 vlan,给定一个端口对象:

代码如下:

def connlist(request, Conn_id): 
    clist = Connection.objects.all() 
    ctx_list = [] 
    ports =[] 
    for c in clist:  # For each coonection 
        plist = c.port_set.all()   # get a list of ports 
        for p in plist:  # for each port 
            vlist = p.vlan_set.all()  # get a set of vlans -- error! 
            portd = {'port': p, 'vlist':vlist} 
            ports.append(portd) 
        ctx= {'conn': c.Description , 'ports': ports} 
        ctx_list.append(ctx) 
    template = loader.get_template('newcon/connlist.html') 
    context = {'cons': ctx_list} 
    return HttpResponse(template.render(context, request)) 

线

    vlist = p.vlan_set.all()  # get a set of vlans -- error! 

报错:

'Port' object has no attribute 'vlan_set'

我不确定我是在向前还是向后引用 vlan。我尝试了两种方法都无济于事。

p.vlan.all()

p.vlan_set.all()

如有任何帮助,我们将不胜感激。

请您参考如下方法:

由于 p 是一个 Port 实例,您不需要调用 _set。你可以简单地写:

p.Vlans.all()

在这种情况下,您只是在 Port 的字段中调用 Vlans,而不是 Vlan 模型。顺便提一下,模型的字段都应该是小写的。干杯!