2011-08-08 51 views
0

我想在我的數據庫中獲得所有手稿的列表,打印出他們每個人的貨架標記,並且在他們鏈接到其他手稿的情況下也打印出那些手稿的貨架標記。Django查詢自我指涉多對多關係

這裏是我的模型是這樣的:

class MSS(models.Model): 
    shelfmark = models.CharField(max_length=50) 
    MSSLink = models.ManyToManyField('self',through='MSSLink',symmetrical=False) 
    [...] 

class MSSLink(models.Model): 
    link1 = models.ForeignKey('MSS', related_name='First_MSS') 
    link2 = models.ForeignKey('MSS', related_name='Second_MSS') 
    [...] 

這裏是views.py

def show_all_MSS(request): 
    all_MSS = MSS.objects.select_related().all() # get all MSS  
    t = loader.get_template('list.html') 
    c = Context({'all_MSS': all_MSS, }) 
    return HttpResponse(t.render(c)) 

接下來的問題是如何在我的模板做的代碼。我想過做這樣的事情,但我不知道我怎麼可以在for循環已被鏈接到另一個MS測試是否當前的MS,如果是如何顯示這些shelfmarks:

{% if all_MSS %} 
    <ul> 
    {% for i in all_MSS %} 
     <li><a href="/MSS/{{ i.shelfmark}}/">{{ i.shelfmark }}</a></li> 
      {% if i.MSSLink %} 
      <p>This MS is linked to the following MSS: {{ i.MSSLink.link1 }}</p> 
      {% endif %} 
    {% endfor %} 
    </ul> 
{% else %} 
    <p>No MSS found</p> 
{% endif %} 

回答

0

你模型有點複雜 - 你或許可以擺脫MSSLink的:

class MSS(models.Model): 
    shelfmark = models.CharField(max_length=50) 
    links = models.ManyToManyField('self', symmetrical=False, blank=True) 

    def __unicode__(self): 
     return self.shelfmark 

,並添加到您的模板:

{% if i.links.all %} 
<ul> 
    {% for l in i.links.all %} 
     <li><a href="/MSS/{{ l.shelfmark}}/">{{ l.shelfmark }}</a></li> 
    {% endfor %} 
</ul> 
{% endif %} 
+0

我需要MSSLink表來獲取關於誰做之間鏈接的用戶信息馬努腳本,鏈接的時間以及鏈接的原因。爲了節省空間,我在我的問題中省略了這些字段。對困惑感到抱歉。您的模板代碼是否僅列出所有手稿?我正在尋找一種列出所有手稿的方法,如果它們也與其他手稿鏈接,也會顯示這些貨架標記。非常感謝! – DigitalMusicology

+0

你將需要第三個循環:'{%for l2 in l.links.all%}' – Udi