【问题标题】:Flask SQL Alchemy question about one-to-many Relationship between 2 different models关于 2 个不同模型之间的一对多关系的 Flask SQLAlchemy 问题
【发布时间】:2020-11-13 20:35:28
【问题描述】:

我是 Flask 的新手,所以对于这个问题的简单性表示歉意。这是我的问题:

我有 2 个模型,位于 2 个不同的目录中(目录布局如下图):

**************#1**************
class User(db.Model, UserMixin):

    # Create a table in the db
    __tablename__ = 'User'

    id = db.Column(db.Integer, primary_key = True)
    email = db.Column(db.String(64), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)
    firstname = db.Column(db.String(64))
    lastname = db.Column(db.String(64))
    password_hash = db.Column(db.String(128))
    is_admin = db.Column(db.Boolean, default=False)
    created =  db.Column(db.DateTime, default=datetime.datetime.utcnow)
    subscription = db.relationship('Subscriptions', backref='owner')

    def __init__(self, email, username, password, firstname, lastname):
        self.email = email
        self.username = username
        self.firstname = firstname
        self.lastname = lastname
        self.password_hash = generate_password_hash(password)

    def check_password(self,password):
        return check_password_hash(self.password_hash,password)

还有:

**************#2**************
class Subscriptions(db.Model):

    # Create a table in the db
    __tablename__ = 'subscriptions'

    id = db.Column(db.String(32), primary_key = True)
    name = db.Column(db.String(64))
    description = db.Column(db.String(255))
    lastcrawled = db.Column(db.Date)
    lastcheckedby = db.Column(db.Integer)
    isActive = db.Column(db.Boolean, default = False)
    datecreated = db.Column(db.Date, default = datetime.date.today())
    user_id = db.Column(db.Integer, db.ForeignKey('User.id'))

    def __init__(self, name):
        self.name = email

我试图弄清楚在显示描述数据时如何访问用户模型中的字段(模型链接在 User.id 字段上)

**************#3**************
    <div class="container">
        <table class="w3-row-padding table table-striped">
            <thead class="thead-dark">
                <tr>
                    <td>Subscription Name</td>
                    <td>description</td>
                    <td>lastcrawled</td>
                    <td>lastcheckedby</td>
                    <td>isActive</td>
                    <td>datecreated</td>
                    <td>Owner</td>
                </tr>
            </thead>
            {% for subscription in subscriptions  %}
            <tr>
                <td>{{subscription.name}}</td>
                <td>{{subscription.description}}</td>
                <td>{{subscription.lastcrawled}}</td>
                <td>{{subscription.lastcheckedby}}</td>
                <td>{{subscription.isActive}}</td>
            </tr>
            {% endfor %}
        </table>
    </div>

下面是我的站点的布局,其中显示了模型的位置。我收到以下错误:

sqlalchemy.exc.ArgumentError: Mapped instance expected for relationship comparison to object.   Classes, queries and other SQL elements are not accepted in this context; for comparison with a subquery, use Subscriptions.owner.has(**criteria).

[在此处输入图片描述][1]

网站布局在这里。非常感谢!!! [1]:https://i.stack.imgur.com/LK0oG.png

【问题讨论】:

    标签: flask sqlalchemy foreign-keys


    【解决方案1】:

    我很确定这只是您的外键的问题,这就是它抛出订阅映射的原因

    # db.ForeignKey needs to be user.id not User.id
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    

    【讨论】:

    • 我不这么认为,因为我明确地命名了我的表 User 而不是允许 SQL alchemy 根据模型名称来命名它。我收到了这个错误:
    • ``` sqlalchemy.exc.NoForeignKeysError:无法确定关系 User.subscription 上的父/子表之间的连接条件 - 没有链接这些表的外键。确保引用列与 ForeignKey 或 ForeignKeyConstraint 相关联,或指定“primaryjoin”表达式。 ```
    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2021-04-03
    • 2016-06-15
    • 2021-08-31
    • 2021-12-09
    相关资源
    最近更新 更多