Попытка получить доступ к атрибуту внешнего ключа, но я получаю сообщение об ошибке.
Вот мой код:
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)
Любая идея, какой правильный способ доступа к внешнему ключу?
Редактировать:
Я использую отношения, потому что я хочу создать ссылку на сообщение в своих почтовых ящиках. Здесь inbox 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 }}
Вы можете получить доступ к внешнему ключу в папке "Входящие", как показано в следующем коде.
for inbox in user_inbox:
if inbox.post: # this is to check if post foreign key is in the inbox.
print inbox.post.title
Я думаю, что ваша логика здесь немного неправильна. Обычно в одном 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)
model.related_models
вместо model.related_model_set
. Но это моя точка зрения. @Zorgan может использовать все, что захочет.
Вы получаете доступ к прямому отношению, поэтому просто используете имя, которое вы фактически определили, то есть post
. Синтаксис _set
относится к обратному отношению, т. _set
К _set
из сообщения в папку "Входящие", который был бы inbox_set
.
Post
. Например, я хочу получить доступ к post.title. Как бы я это сделал?
post
.