簡體   English   中英

無法在 Django 中引用相關的多對多對象

[英]Can't reference related many-to-many object in Django

這是我的模型:

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!

給出一個錯誤:

“端口”對象沒有屬性“vlan_set”

我不確定我是在向前還是向后引用 vlan。 我兩種方法都試過了,沒用。

p.vlan.all()

p.vlan_set.all()

任何幫助將不勝感激。

由於pPort實例,因此您無需調用_set 你可以簡單地寫:

p.Vlans.all()

在這種情況下,您只是在Port的字段中調用Vlans ,而不是Vlan模型。 順便提一下,模型的字段都應該是小寫的。 干杯!

您將ManyToMany關系命名為Vlans = models.ManyToManyField(Vlan, blank=True) ,這意味着您可以通過以下方式訪問相關的vlans

p.Vlans.all()

注意:通常一個類的屬性是用lowercase_with_underscores寫的,所以你應該把它改寫成vlans而不是Vlans

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM