【问题标题】:Flask-SQLAlchemy - Backref isn't working, value is NoneFlask-SQLAlchemy - Backref 不起作用,值为 None
【发布时间】:2016-08-29 21:43:27
【问题描述】:

我想我和here on SO. 使用 python 3.5、flask-sqlalchemy 和 sqlite 有同样的问题。我正在尝试建立一个(用户)对多(帖子)的关系。

class User(db_blog.Model):
    id = db_blog.Column(db_blog.Integer, primary_key=True)
    nickname = db_blog.Column(db_blog.String(64), index=True, unique=True)
    email = db_blog.Column(db_blog.String(120), unique=True)
    posts = db_blog.relationship('Post', backref='author', lazy='dynamic')

    def __repr__(self):
        return '<User: {0}>'.format(self.nickname)

class Post(db_blog.Model):
    id = db_blog.Column(db_blog.Integer, primary_key=True)
    body = db_blog.Column(db_blog.String(2500))
    title = db_blog.Column(db_blog.String(140))
    user_id = db_blog.Column(db_blog.Integer, db_blog.ForeignKey('user.id'))

    def __init__(self, body, title, **kwargs):
        self.body = body
        self.title = title

    def __repr__(self):
        return '<Title: {0}\nPost: {1}\nAuthor: {2}>'.format(self.title, self.body, self.author)

作者为无。

>>> u = User(nickname="John Doe", email="jdoe@email.com")
>>> u
<User: John Doe>
>>> db_blog.session.add(u)
>>> db_blog.session.commit()
>>> u = User.query.get(1)
>>> u
<User: John Doe>
>>> p = Post(body="Body of post", title="Title of Post", author=u)
>>> p
<Title: Title of Post
Post: Body of post
Author: None> #Here I expect- "Author: John Doe>"

我在帖子的会话添加/提交后得到相同的结果,因此找不到帖子作者。

【问题讨论】:

    标签: python sqlite flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    如果将新创建的post添加到用户的posts属性中,就可以了:

    >>> u = User(nickname="John Doe", email="jdoe@email.com")
    >>> u
    <User: John Doe>
    >>> db_blog.session.add(u)
    >>> p = Post(body="Body of post", title="Title of Post")
    >>> p
    <Title: Title of Post
    Post: Body of post
    Author: None>
    >>> db_blog.session.add(p)
    >>> db_blog.session.commit()
    >>> u.posts.append(p)
    >>> p
    <Title: Title of Post
    Post: Body of post
    Author: <User: John Doe>>
    >>> p.author
    <User: John Doe>
    

    您的代码无法按原样运行的原因是因为您为 Post 类定义了 __init__ 构造函数,而这根本不考虑 author 字段,因此 Python 不会不知道如何处理 author 参数。

    【讨论】:

    • 此解决方案在重新排列后有效,但没有回答原始代码失败的原因。重新排列:u = User.query.get(1) p = Post("body", "title")u.posts.append(p)db_blog.session.add(p) and commit,结果就是我想要的。但是我的代码基于 Grinberg 和其他人的代码,他们不需要将帖子附加给用户。他们的代码与我的示例一样,通过将用户查询插入到帖子中。前任。 author=u。在我接受之前,谁能回答为什么我的代码会按原样失败? microblog tutorial
    • @Cha0 我已经更新了我的答案并提供了进一步的解释
    【解决方案2】:

    您将自己的__init__ 添加到Post。虽然它接受关键字参数,但它对它们不做任何事情。您可以更新它以使用它们

    def __init__(self, body, title, **kwargs):
        self.body = body 
        self.title = title
        for k, v in kwargs:
            setattr(self, k, v)
    

    或者,理想情况下,您可以删除该方法并让 SQLAlchemy 为您处理它。

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 2017-11-18
      • 2015-09-01
      • 2012-08-16
      相关资源
      最近更新 更多