创建一个条目时,在另一个表中创建条目

时间:2017-11-19 00:22:37

标签: python sql flask sqlalchemy

好吧,所以我确定标题很混乱,所以我会尽力在这里解释一下。我正在创建一个简单的网站,允许人们搜索电影和电视节目。如果他们是用户,他们还可以将Movie / Tv节目添加到他们的监视列表中。截至目前,我有这些表格:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    watchList_id = db.Column(db.Integer, db.ForeignKey('watchList.watchList_id'), nullable=False, autoincrement=True)
    first_name = db.Column(db.String(120))
    last_name = db.Column(db.String(120))
    email = db.Column(db.String(180), unique=True)
    password = db.Column(db.String(255))
    is_admin = db.Column(db.Boolean(), default=False)
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic'))


class watchList(db.Model):
    __tablename__ = "watchList"

    watchList_id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    title = db.Column(db.String(200), unique=True)
    releaseDate = db.Column(db.Date)
    producer = db.Column(db.String(100))
    description = db.Column(db.String(300))
    genre = db.Column(db.String(50))
    image = db.Column(db.String(300))

我基本上希望功能能够在用户创建时为该用户创建一个监视列表,但是现在我不断得到一个错误,即当用户创建时,watchList_id没有值,因为我必须这样做想法如何做到这一点。我想以某种方式设置user_id == watchList_id,但我不知道该怎么做。有任何想法吗?如果需要,我可以发送更多代码。我正在使用flask-security,所以我不知道如何查看Register的python / flask代码。

2 个答案:

答案 0 :(得分:0)

我认为你应该为此目的使用自定义方法。它对你有用,但我没有运行代码,所以你可以根据你修改。

class watchList(db.Model):
     __tablename__ = "watchList"

     watchList_id = db.Column(db.Integer, autoincrement=True, 
     primary_key=True)
     title = db.Column(db.String(200), unique=True)
     releaseDate = db.Column(db.Date)
     producer = db.Column(db.String(100))
     description = db.Column(db.String(300))
     genre = db.Column(db.String(50))
     image = db.Column(db.String(300))

     @classmethod
     def create_func(cls, **kw):
          obj = cls(**kw)
          #----creating User object with obj(watchList)

当你完成时,请告诉我。谢谢。

答案 1 :(得分:0)

如果您正确使用会话,这就像将其添加到用户的构造函数一样简单。您有用户构造函数创建一个新的watchlist对象并将其附加到映射关系。当提交创建用户的调用时,两者都将被创建,并且两者都将在那时获得它们的ID。看看你的代码,在我看来你的关系可能倒退了。如果监视列表由用户拥有,则通常在监视列表上有一个user_id列,该列是User的外键,然后在Users上为“监视列表”建立映射关系。如果您想确保每个用户只有一个,您可以使用相同的模式,但将uselist = False arg传递给关系。

然后您的用户类可以执行:

class User(db.Model, UserMixin):
    def __init__(self, **kwargs):
        # set up cols for user
        for k,v in kwargs.items():
            setattr(self, k, v)
        # create watchlist: watchlist and user will both get their ids
        # created at the same time when the session creating User 
        # is committed, and watchlist will have the user_id key too
        self.watchlist = Watchlist()

如果您还没有这样做,我建议您通过优秀的SQLAlchemy ORM教程。一个好的经验法则是,如果您必须使用您的id cols手动执行任何,那么您使用的会话是错误的。 HTH!