小编mik*_*ike的帖子

自我参考很多很多烧瓶 - sqlalchemy

我为我的生活无法弄清楚为什么这种自我引用的多对多不会幸福:

minor_contains = db.Table(
    'minor_contains',
    db.Column('parent_id', db.Integer, db.ForeignKey('minors.id'),
            primary_key=True),
    db.Column('contains_id', db.Integer, db.ForeignKey('minors.id'),
            primary_key=True))

class Minor(db.Model):
    __tablename__ = 'minors'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String())
    ...
    contains = db.relationship(
        "Minor",
        secondary=minor_contains,
        primaryjoin="id == minor_contains.c.parent_id",
        secondaryjoin="id == minor_contains.c.contains_id",
        backref="contained_by",
        lazy='dynamic')
Run Code Online (Sandbox Code Playgroud)

基于我在SQLAlchemy和Flask-SQLAlchemy中看到的示例,我尝试过几种不同的方式重新编写它,但我总是最终得到以下错误消息,或者我最终在某个地方无限循环.

E ArgumentError:找不到涉及Minor.contains关系的主要连接条件"minor_contains.parent_id =:parent_id_1"的本地映射外键列的任何简单相等表达式.确保引用列与ForeignKey或ForeignKeyConstraint相关联,或者在带有foreign()注释的连接条件中进行注释.为了允许"=="以外的比较运算符,可以将关系标记为viewonly = True.

UPDATE

我真的无法理解错误消息,因为它显示了连接表中的列与自身进行比较,其中连接上的条件应该是minors表的PK与连接表中的FK相比较.

我还将添加一个永远挂起的版本.你会看到我一直在改变变量名称,只是重复一遍又一遍地希望如果我对它进行新的尝试,我会以某种方式在第二次或第五次变得更聪明.

minor_contains = db.Table(
    'minor_contains',
    db.Column('parent_minor_id', db.Integer, db.ForeignKey('minors.id'),
            primary_key=True),
    db.Column('contains_minor_id', db.Integer, db.ForeignKey('minors.id'),
            primary_key=True))

class Minor(db.Model):
    __tablename__ = 'minors'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String())
    ...
    contains = db.relationship(
        "Minor",
        secondary=minor_contains,
        primaryjoin=id==minor_contains.c.parent_minor_id,
        secondaryjoin=id==minor_contains.c.contains_minor_id, …
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy flask flask-sqlalchemy

8
推荐指数
1
解决办法
1174
查看次数

Flask-WTF model_form、Sqlalchemy 和外键

我正在尝试使用我的模型并使用 wtform 的 model_form for sqlalchemy 生成表单。我希望带有外键约束的字段是该表中所有项目的选择列表。

到目前为止,对于文字外键,我要么什么也得不到,要么得到一个简单的文本输入,我有点迷茫。

好的,所以我这里有一个相对简单的数据模型。为此,我可以将其减少到我拥有的硬件类型及其支持状态。我希望将来能够添加支持状态,并为它们提供更多有用的描述。

from . import db
class Status(db.Model):
    """Support status"""
    __tablename__ = 'status'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique=True)
    description = db.Column(db.Text)
    def __repr__(self):
        return self.name

class Hardware(db.Model):
    """Hardware"""
    __tablename__ = 'hardware'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique=True)
    description = db.Column(db.Text)
    status = db.Column(db.Integer, db.ForeignKey('status.id'))
    ...
    def __repr__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

时髦。

现在我的观点是这样的:

from flask import render_template, request, flash, redirect, url_for
from flask_wtf import Form
from …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy wtforms flask-sqlalchemy flask-wtforms

5
推荐指数
1
解决办法
2372
查看次数