【问题标题】:Django Querying Self-referential Many-To-Many relationsDjango查询自引用多对多关系
【发布时间】:2011-08-08 23:36:27
【问题描述】:

我正在尝试获取我的数据库中所有手稿的列表,打印出每个手稿的货架标记,如果它们与其他手稿链接,也打印出这些手稿的货架标记。

这是我的模型的样子:

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,如果是,如何显示这些货架标记:

{% 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 %}

【问题讨论】:

    标签: python django many-to-many self-reference


    【解决方案1】:

    您的模型有点复杂 - 您可能可以摆脱 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 %}
    

    【讨论】:

    • 我需要 MSSLink 表来捕获有关在手稿之间建立链接的用户、链接时间以及链接原因的信息。我在我的问题中省略了这些字段以节省空间。对困惑感到抱歉。您的模板代码是否仅列出所有手稿?我正在寻找一种列出所有手稿的方法,如果它们也链接到其他手稿,也会显示这些架子标记。非常感谢!
    • 您将需要第三个 for 循环:{% for l2 in l.links.all %}
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 2014-07-14
    • 2021-03-07
    • 2019-05-18
    • 2017-02-02
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多