Как получить доступ к внешнему ключу модели в цикле for

-1

Попытка получить доступ к атрибуту внешнего ключа, но я получаю сообщение об ошибке.

Вот мой код:

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 }}
  • 0
    Ваше редактирование никоим образом не противоречит тому, что указывает wencakisa. Если вы хотите эти отношения, переместите внешний ключ в модель Post.
  • 0
    Как это облегчит? Как будет выглядеть мой цикл for в шаблоне входящих сообщений?
Показать ещё 1 комментарий
Теги:

3 ответа

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 
  • 0
    Как бы я получить доступ к inbox.post.title?
  • 0
    распечатать inbox.post.title
Показать ещё 3 комментария
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)
  • 0
    Хороший вопрос, хотя я не уверен, почему вы думаете, что настроенное имя «более идиоматично», чем имя по умолчанию.
  • 0
    @DanielRoseman Я думаю, что проще сказать model.related_models вместо model.related_model_set . Но это моя точка зрения. @Zorgan может использовать все, что захочет.
1

Вы получаете доступ к прямому отношению, поэтому просто используете имя, которое вы фактически определили, то есть post. Синтаксис _set относится к обратному отношению, т. _set К _set из сообщения в папку "Входящие", который был бы inbox_set.

  • 0
    Извините, я неправильно сформулировал вопрос. Я хочу получить доступ к атрибутам Post . Например, я хочу получить доступ к post.title. Как бы я это сделал?
  • 0
    Точно, как я сказал в ответе: по post .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню