В настоящее время я борюсь за создание веб-таблиц с использованием bootstrap datatables, sqlalchemy и sqlalchemy-datatables.
Sqlalchemy, кажется, генерирует правильный sql запрос, таблицы данных заполнены правильной информацией.
Однако, когда я пытаюсь найти запись в поле поиска с данными, я получаю сообщение об ошибке:
Предупреждение DataTables: идентификатор таблицы = main_table - Ни объект «InstrumentedAttribute», ни Объект «Comparator», связанный с VrfMain.scope, имеет атрибут «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)
Вот часть flask кода:
# 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"]],