这是我的模型:
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 模型。顺便提一下,模型的字段都应该是小写的。干杯!
