【问题标题】:How do you retrieve Django objects from a recursive many to many relationship?如何从递归多对多关系中检索 Django 对象?
【发布时间】:2017-07-20 01:21:29
【问题描述】:

我有一个代表文章的 Django 类。有时一篇文章会与一篇或多篇其他文章发生冲突,我在课堂上使用递归多对多关系表示这种关系,如下所示:

class Article(models.Model): 
    comments_on = models.ManyToManyField('self', blank=True)

我认为通过在 cmets_on 字段中选择多篇文章,我已经在管理界面中成功地将文章相互关联了。假设一篇文章 (id1) 与另外两篇文章 (id2 和 id3) 发生冲突。我不知道如何访问 id1 的 cmets_on 属性,以便 id2 和 id3 出现在我的 Django 模板中。

我试过了:

{{ [instance of Article object].comments_on }}

但我得到的只是:

[name of my app].Article.None

我想知道 (1) 如何访问此属性并使其显示? (2) 我如何一次访问其中一篇相关文章?例如,如果 id2 和 id3 上都有 id1 cmets,我如何只显示 id2 或只显示 id3?

【问题讨论】:

  • cmets_on 是一个 M2M 字段,因此您必须对来自 Article.comments_on.all() 的返回查询集执行 for 循环并显示它们的属性。
  • 谢谢。我尝试使用 myvariable = Article.cmets_on.all() 将其分配给我在views.py中的函数中的一个变量,然后我尝试遍历我的html文件中的myvariable,但我收到一个AttributeError,上面写着:'ManyToManyDescriptor'对象没有“全部”属性
  • 首先Article是模型的类名。 Article.comments_on 将返回 ManyToManyDescriptor 函数。您只需调用[instance of Article].comments_on.all() 即可获取查询集。

标签: python django recursion many-to-many


【解决方案1】:

感谢您的所有建议。根据你的cmets,我解决了如下:

在views.py中,我写道:

myvariable = Article.objects.all()

然后将其传递给上下文字典,以便我可以在网页中呈现变量。

在模板上,我写道:

{% if item.comments_on.all.count == 1 %}
    {% for key in item.commented_on_by.all %}
      <strong>This study criticized:</strong> <a href="#">{{ key }}</a>
    {% endfor %}
 {% endif%}

  {% if item.comments_on.all.count > 1 %}
    <strong>This study criticized:</strong>
    <ul>
      {% for key in item.comments_on.all %}
        <li><a href="#">{{ key }}</a></li>
      {% endfor %}
    </ul>
  {% endif%}

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2018-05-23
    • 2017-01-12
    相关资源
    最近更新 更多