Как узнать автора карточки?

Я создал две связанные таблицы, и вот как они выглядят: <pre><code class="python">class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(30), nullable=False, unique=True, index=True)
    password = db.Column(db.String)
    rol = db.Column(db.String(15), index=True)
    date_registration = db.Column(db.DateTime, default=datetime.utcnow)
    user_cards = db.relationship("Cards", backref="user")


class Cards(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)
    text = db.Column(db.Text)
    date_add_card = db.Column(db.DateTime, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))</code></pre> 

На странице /index я вывел все карточки и даты их добавления. Теперь у меня возник вопрос: как вывести автора каждой карточки? 

Вот HTML код, который я использую: <br/> <pre><code class="html">{% for el in list_cards %}
{{ el.name }}
{{ el.text }}
Дата публикации: {{ el.date_add_card.date() }}
Автор: {{ el.user_id }}</code></pre> 

В текущем варианте у меня выводится user_id, но я не могу обратиться к username. Я пытался сделать так: <code class="html">Автор: {{ el.user_id.username }}</code>, но это не работает, в то время как {{ el.user_id }} выводит корректный ID автора. Как мне правильно получить имя пользователя?
  • 13 сентября 2024 г. 21:13
Ответы на вопрос 2
Чтобы получить имя пользователя (username) автора карточки, вам нужно использовать связь между таблицами, которую вы уже определили. В классе `Cards` вы создали отношение к пользователю через внешний ключ `user_id`, что позволит вам получить экземпляр `User`, связанный с каждой карточкой.

В вашем случае вы можете обратиться к пользователю через свойство backref (в данном случае `user`) объекта `Cards`. То есть, вам нужно заменить `{{ el.user_id }}` на `{{ el.user.username }}`. Это вызовет атрибут `username` объекта `User`, связанного с данной карточкой.

Ваш HTML код будет выглядеть следующим образом:

```html
{% for el in list_cards %}
    {{ el.name }}
    {{ el.text }}
    Дата публикации: {{ el.date_add_card.date() }}
    Автор: {{ el.user.username }}
{% endfor %}
```

Таким образом, каждая карточка будет выводить имя пользователя вместо его идентификатора. Убедитесь, что в списке `list_cards` вы действительно загружаете все необходимые данные (в данном случае связанные пользователи) при выборке карточек из базы данных. Если вы используете SQLAlchemy, вы можете воспользоваться методом `joinedload()` для этого. Например:

```python
from sqlalchemy.orm import joinedload

list_cards = Cards.query.options(joinedload(Cards.user)).all()
```

Это поможет избежать дополнительных запросов к базе данных и загрузить информацию о пользователе за один запрос.
Если кратко осенило меня решением оно оказалось довольно простым я должен был обращаться через то что написано в backref , а в моем случае это было "user" написал вместо Автор: {{ el.user_id.username }} вот это Автор: {{ el.user.username }} и о чудо оно сработало
Похожие вопросы