SQLAlchemy - инициализировать роли с помощью user_id - PullRequest
0 голосов
/ 24 апреля 2019

Это моя модель списка воспроизведения, инициализированная с параметром "title":

class Playlist(db.Model):
    """
    Model for storing playlist information belonging to a specific user
    """
    __tablename__ = 'playlist'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50))
    created = db.Column(db.DateTime, default=func.now())

    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    def __init__(self, title):
        self.title = title

    def serialize(self):
       return {
           'id' : self.id,
           'created' : self.created,
           'title': self.title,
       }

Я хотел бы инициализировать все мои SQALchemy роли, также передавая user_id, чтобы запросить мою базу данных следующим образом:

playlist = Playlist.query.join(User, User.id == Playlist.user_id).filter(
                and_(Playlist.title == 'Cache', User.id == 1)).first()

Я знаю, что вы можете запросить User по идентификатору, например:

User.query.get(1)

Но как лучше всего передать user_id на Playlist __init__()? Это рекомендуется?

1 Ответ

0 голосов
/ 24 апреля 2019

Обычно конструктор по умолчанию, унаследованный от db.Model, достаточен без необходимости предоставления собственного. Конструктор модели по умолчанию будет принимать ключевые аргументы и присваивать эти значения правильным столбцам.

Я взял ваш код сверху и немного адаптировал его, чтобы показать это:

class User(db.Model):
    __tablename__ = 'user'

    name = db.Column(db.String())


class Playlist(db.Model):
    """
    Model for storing playlist information belonging to a specific user
    """
    __tablename__ = 'playlist'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50))
    created = db.Column(db.DateTime, default=func.now())

    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    user = db.relationship("User", backref=db.backref("playlists"))

    def serialize(self):
       return {
          'id' : self.id,
          'created' : self.created,
          'title': self.title,
       }


user = User(name="John")
playlist = Playlist(title="My playlist", user=user)

print(playlist.user)
print(user.playlists)

Когда вы передаете экземпляр пользователя в список воспроизведения, SQLAlchemy автоматически позаботится о назначении внешнего ключа для указания этому пользователю.

Если вы все еще хотели иметь специальный конструктор для Playlist, вы, вероятно, захотите добавить к нему super().__init__(*args, **kwargs), чтобы логика в базовом конструкторе все еще выполнялась.

Надеюсь, это поможет!

...