尝试访问外键属性,但我收到错误。
这是我的代码:
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 }}
答案 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