【问题标题】:Create entry in another table when one entry is created创建一个条目时在另一个表中创建条目
【发布时间】:2017-11-19 00:22:37
【问题描述】:

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

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 代码。

【问题讨论】:

    标签: python sql flask sqlalchemy


    【解决方案1】:

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

    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)
    

    完成后请告诉我。谢谢。

    【讨论】:

    【解决方案2】:

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

    那么你的用户类可以这样做:

    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!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 2014-09-30
      • 2022-07-16
      • 2011-01-19
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多