【问题标题】:Sqlalchemy relationship issue working with datatables使用数据表的 Sqlalchemy 关系问题
【发布时间】:2020-08-03 01:40:02
【问题描述】:

我目前正在努力使用引导数据表、sqlalchemy 和 sqlalchemy-datatables 创建 Web 表。

Sqlalchemy 似乎生成了正确的 sql 查询,数据表中填充了正确的信息。

但是,当我尝试在数据表搜索字段中搜索记录时,出现错误:

DataTables 警告:表 id=main_table - 与 VrfMain.scope 关联的“InstrumentedAttribute”对象和“Comparator”对象都没有属性“cast”

我试图从查询中删除任何关系,并且它有效。 所以问题出在某个地方的关系上。谁能帮帮我?

这是我的 sql 模型:

class VrfMain(db.Model):
    __tablename__ = 'vrf_main'

    id = Column(Integer, primary_key=True, autoincrement=True)
    vrf_name = Column(String, unique=True)
    rd = Column(String, unique=True)
    primary_rt = Column(String, unique=True)
    additional_rt = Column(String, unique=True)
    description = Column(String)
    scope_id = Column(Integer, ForeignKey('subnet_scopes.id'))

    scope = relationship('SubnetScopes')


    def __init__(self, vrf_name, rd, primary_rt, description, scope_id):
        self.vrf_name = vrf_name
        self.rd = rd
        self.primary_rt = primary_rt
        self.description = description
        self.scope_id = scope_id

class SubnetScopes(db.Model):
    __tablename__ = 'subnet_scopes'

    id = Column(Integer, primary_key=True, autoincrement=True)
    scope_name = Column(String, unique=True)

    def __init__(self, scope_name):
        self.scope_name = scope_name

    def __repr__(self):
        return str(self.scope_name)

这是烧瓶代码的一部分:

# defining datatable columns
columns = [
    ColumnDT(VrfMain.id),
    ColumnDT(VrfMain.vrf_name),
    ColumnDT(VrfMain.rd),
    ColumnDT(VrfMain.primary_rt),
    ColumnDT(VrfMain.additional_rt),
    ColumnDT(VrfMain.description),
    ColumnDT(VrfMain.scope)
]

query = VrfMain.query.\
    join(SubnetScopes).\
    filter(VrfMain.scope_id == SubnetScopes.id).\
    with_entities(VrfMain.id, VrfMain.vrf_name, VrfMain.rd, VrfMain.primary_rt, VrfMain.additional_rt, VrfMain.description, SubnetScopes.scope_name)

print(query)
params = request.args.to_dict()
rowTable = DataTables(params, query, columns)
return jsonify(rowTable.output_result())

这是生成的 sql 查询

SELECT vrf_main.id AS vrf_main_id, vrf_main.vrf_name AS vrf_main_vrf_name, vrf_main.rd AS vrf_main_rd, vrf_main.primary_rt AS vrf_main_primary_rt, vrf_main.additional_rt AS vrf_main_additional_rt, vrf_main.description AS vrf_main_description, subnet_scopes.scope_name AS subnet_scopes_scope_name
FROM vrf_main INNER JOIN subnet_scopes ON subnet_scopes.id = vrf_main.scope_id
WHERE vrf_main.scope_id = subnet_scopes.id

这里是javascript代码:

  $(document).ready(function() {
    var table = $('#main_table').DataTable({
        "processing": true,
        "serverSide": true,
        "ajax": {
            "url": "{{ url_for('home_blueprint.get_vrf_data') }}"
        },
        "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],

【问题讨论】:

    标签: datatables sqlalchemy relationship


    【解决方案1】:

    我决定不使用 sqlalchemy-datatables。相反,我将使用代码:

    all_vrf_data = []
    for row in VrfMain.query.all():
        row_proccessed = dict(row.__dict__); row_proccessed.pop('_sa_instance_state', None)
        all_vrf_data.append(row_proccessed)
    
    return_data = {"data": all_vrf_data}
    return json.dumps(return_data, indent=4, sort_keys=True, default=str)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多