Flask SQLAlchemy:添加第三列以加入 table
Flask SQLAlchemy: adding third column to joining table
上下文:我正在制作一个我正在使用 Flask-SQLAlchemy 的拍卖网站。我的 table 需要多对多关系(因为一个艺术品可以有多个用户出价,一个用户可以对多个艺术品出价)
我的问题是:是否可以在我的加入中添加另一列 table 以包含用户出价的 id、他们出价的艺术品的 id 以及出价多少?另外,如果是,当我向 table 添加记录时,如何将此出价包含在 table 中?
bid_table = db.Table("bid_table",
db.Column("user_id", db.Integer, db.ForeignKey("user.user_id")),
db.Column("item_id", db.Integer, db.ForeignKey("artpiece.item_id"))
)
class User(db.Model):
user_id = db.Column(db.Integer, unique=True, primary_key=True, nullable=False)
username = db.Column(db.Integer, unique=True, nullable=False)
email = db.Column(db.String(50), unique =True, nullable=False)
password = db.Column(db.String(60), nullable=False)
creation_date = db.Column(db.DateTime, default=str(datetime.datetime.now()))
bids = db.relationship("Artpiece", secondary=bid_table, backref=db.backref("bids", lazy="dynamic"))
class Artpiece(db.Model):
item_id = db.Column(db.Integer, unique=True, primary_key=True, nullable=False)
artist = db.Column(db.String(40), nullable=False)
buyer = db.Column(db.String(40), nullable=False)
end_date = db.Column(db.String(40))
highest_bid = db.Column(db.String(40))
用 SQL Alchemy 可以做到这一点,但我认为这很麻烦。
SQLAlchemy 使用一个称为 关联代理 的概念将普通 table 转换为关联 table。这个 table 可以有任何你想要的数据字段,但你必须手动告诉 SQLAlchemy 哪些列是其他两个 table 的外键。
这是文档中的一个很好的例子。
在您的情况下,UserKeyword table 是您要为 user/bid 场景构建的关联代理 table。
special_key
列是您要存储的任意数据,例如出价金额。
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import backref, declarative_base, relationship
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(64))
# association proxy of "user_keywords" collection
# to "keyword" attribute
keywords = association_proxy('user_keywords', 'keyword')
def __init__(self, name):
self.name = name
class UserKeyword(Base):
__tablename__ = 'user_keyword'
user_id = Column(Integer, ForeignKey('user.id'), primary_key=True)
keyword_id = Column(Integer, ForeignKey('keyword.id'), primary_key=True)
special_key = Column(String(50))
# bidirectional attribute/collection of "user"/"user_keywords"
user = relationship(User,
backref=backref("user_keywords",
cascade="all, delete-orphan")
)
# reference to the "Keyword" object
keyword = relationship("Keyword")
def __init__(self, keyword=None, user=None, special_key=None):
self.user = user
self.keyword = keyword
self.special_key = special_key
class Keyword(Base):
__tablename__ = 'keyword'
id = Column(Integer, primary_key=True)
keyword = Column('keyword', String(64))
def __init__(self, keyword):
self.keyword = keyword
def __repr__(self):
return 'Keyword(%s)' % repr(self.keyword)
查看完整文档,了解有关如何访问和创建此类模型的说明。
在实际项目中使用过,不是特别好玩,如果能避免的话,我会推荐它。
https://docs.sqlalchemy.org/en/14/orm/extensions/associationproxy.html
上下文:我正在制作一个我正在使用 Flask-SQLAlchemy 的拍卖网站。我的 table 需要多对多关系(因为一个艺术品可以有多个用户出价,一个用户可以对多个艺术品出价)
我的问题是:是否可以在我的加入中添加另一列 table 以包含用户出价的 id、他们出价的艺术品的 id 以及出价多少?另外,如果是,当我向 table 添加记录时,如何将此出价包含在 table 中?
bid_table = db.Table("bid_table",
db.Column("user_id", db.Integer, db.ForeignKey("user.user_id")),
db.Column("item_id", db.Integer, db.ForeignKey("artpiece.item_id"))
)
class User(db.Model):
user_id = db.Column(db.Integer, unique=True, primary_key=True, nullable=False)
username = db.Column(db.Integer, unique=True, nullable=False)
email = db.Column(db.String(50), unique =True, nullable=False)
password = db.Column(db.String(60), nullable=False)
creation_date = db.Column(db.DateTime, default=str(datetime.datetime.now()))
bids = db.relationship("Artpiece", secondary=bid_table, backref=db.backref("bids", lazy="dynamic"))
class Artpiece(db.Model):
item_id = db.Column(db.Integer, unique=True, primary_key=True, nullable=False)
artist = db.Column(db.String(40), nullable=False)
buyer = db.Column(db.String(40), nullable=False)
end_date = db.Column(db.String(40))
highest_bid = db.Column(db.String(40))
用 SQL Alchemy 可以做到这一点,但我认为这很麻烦。
SQLAlchemy 使用一个称为 关联代理 的概念将普通 table 转换为关联 table。这个 table 可以有任何你想要的数据字段,但你必须手动告诉 SQLAlchemy 哪些列是其他两个 table 的外键。
这是文档中的一个很好的例子。
在您的情况下,UserKeyword table 是您要为 user/bid 场景构建的关联代理 table。
special_key
列是您要存储的任意数据,例如出价金额。
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import backref, declarative_base, relationship
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(64))
# association proxy of "user_keywords" collection
# to "keyword" attribute
keywords = association_proxy('user_keywords', 'keyword')
def __init__(self, name):
self.name = name
class UserKeyword(Base):
__tablename__ = 'user_keyword'
user_id = Column(Integer, ForeignKey('user.id'), primary_key=True)
keyword_id = Column(Integer, ForeignKey('keyword.id'), primary_key=True)
special_key = Column(String(50))
# bidirectional attribute/collection of "user"/"user_keywords"
user = relationship(User,
backref=backref("user_keywords",
cascade="all, delete-orphan")
)
# reference to the "Keyword" object
keyword = relationship("Keyword")
def __init__(self, keyword=None, user=None, special_key=None):
self.user = user
self.keyword = keyword
self.special_key = special_key
class Keyword(Base):
__tablename__ = 'keyword'
id = Column(Integer, primary_key=True)
keyword = Column('keyword', String(64))
def __init__(self, keyword):
self.keyword = keyword
def __repr__(self):
return 'Keyword(%s)' % repr(self.keyword)
查看完整文档,了解有关如何访问和创建此类模型的说明。
在实际项目中使用过,不是特别好玩,如果能避免的话,我会推荐它。
https://docs.sqlalchemy.org/en/14/orm/extensions/associationproxy.html