append () в поле отношений не добавляет новый элемент. Поле остается пустым без ошибок - PullRequest
0 голосов
/ 27 февраля 2020

В приведенном ниже примере я создаю новый объект UserRelationship с именем new_follow, который затем пытаюсь добавить в поле user.follows с помощью этой команды:

self.follows.append(new_follow)

однако, когда я вызываю breakpoint () во время выполнения, я вижу, что новый экземпляр объекта UserRelationship был создан достаточно хорошо, но вызов self.follows.append(new_follow) просто ничего не делает. Если я тогда позвоню self.follows.all(), это выдаст мне пустой список как [].

Справочная информация: это работало в Flask, и я теперь перешел на Fast API, я считаю, что моя БД настроена несколько иначе. Конфигурация БД находится внизу.

from .database import SessionLocal
db = SessionLocal()

class UserRelationship(Base):
    __tablename__ = 'userrelationship'
    id = Column(Integer, primary_key=True)
    follows_id = Column(Integer, ForeignKey('user.id'))
    follower_id = Column(Integer, ForeignKey('user.id'))
    followed = relationship("User", foreign_keys=[follows_id])
    follower = relationship("User", foreign_keys=[follower_id])
    budget = Column(Float(decimal_return_scale=8), default=0)
    trade_size_percentage = Column(Float(decimal_return_scale=2), default=None)
    approved = Column(Boolean(), default=False)
    extend_existing = True

    def __repr__(self):
        return f'{self.follower.username} follows {self.followed.username} with {self.budget}'


class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    username = Column(String(64), index=True, unique=True)
    follows = relationship('UserRelationship',
                           primaryjoin=(UserRelationship.follower_id == id),
                           backref=backref('followers'),
                           lazy='dynamic',
                           cascade='all, delete')


    def follow(self, user):
        if not self.is_following(user):
            new_follow = UserRelationship(budget=budget, followed=user, follower=self)
            self.follows.append(new_follow)
            db.commit()
            breakpoint()
            return new_follow
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import os
from dotenv import load_dotenv

load_dotenv()

SQLALCHEMY_DATABASE_URL = os.environ.get('SQLALCHEMY_DATABASE_URI')

engine = create_engine(SQLALCHEMY_DATABASE_URL)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

ОБНОВЛЕНИЕ:

Я видел, что вызванный db.commit() на конечной точке, а не на самой модели, означает объект UserRelationship сохраняется в базе данных. Как я могу создать «сеанс» для использования непосредственно в моих моделях, а также сеанс, вызываемый через инфраструктуру (Fast API)? Платформа создает новый сеанс для каждого запроса, который я затем использую в конечной точке, db= get_db(), поэтому db.commit() et c. Как получить такую ​​же функциональность на моих моделях?

# Dependency
def get_db():
    try:
        db = SessionLocal()
        yield db
    finally:
        db.close()

...