如何在for循环中访问模型的外键

时间:2017-09-07 09:00:11

标签: python django

尝试访问外键属性,但我收到错误。

这是我的代码:

for inbox in user_inbox:
    for i in inbox.post_set.all:
        print(i.title)

错误:

AttributeError: 'Inbox' object has no attribute 'post_set'

模型

class Inbox(models.Model):
    ...
    text = models.CharField(max_length=200)
    post = models.ForeignKey(Post, blank=True, null=True)


class Post(models.Model):
    ...
    title = models.TextField(max_length=95)

知道访问外键的正确方法是什么?

编辑:

我正在使用我的关系,因为我想创建一个指向收件箱中帖子的链接。这是收件箱html:

<div id="inbox_menu">
    {% for inbox in user_inbox %}
        {% for i in inbox.post_set.all %}
            <a href="{% url 'article' category=i.category id=i.id %}">
        {% endfor %}
    {{ inbox.text }}

3 个答案:

答案 0 :(得分:2)

我认为你的逻辑在这里有点不对劲。通常,一个 Inbox多个 Post s,而不是相反的关系。

因此,您需要在Post模型中与Inbox模型建立外键关系。

class Inbox(models.Model):
    # ...
    text = models.CharField(max_length=200)


class Post(models.Model):
    # ...
    title = models.TextField(max_length=95)
    inbox = models.ForeignKey(Inbox, blank=True, null=True, related_name='posts')

另请注意,我已将related_name字段添加到ForeignKey字段。现在,您可以通过Inbox代替inbox.posts获取inbox.post_set个帖子。它更具惯用性。

然后在你的循环中:

for inbox in user_inbox:
    for post in inbox.posts.all():
        print(post.title)

答案 1 :(得分:1)

您正在访问转发关系,因此您只需使用您实际定义的名称,即post_set语法用于反向关系,即从Post发送到收件箱的关系,即inbox_set

答案 2 :(得分:1)

您可以访问收件箱的外键,如下面的代码所示。

for inbox in user_inbox:
    if inbox.post: # this is to check if post foreign key is in the inbox.
        print inbox.post.title