Проблема отношений Sqlalchemy при работе с таблицами данных - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время я борюсь за создание веб-таблиц с использованием 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"]],

1 Ответ

0 голосов
/ 21 апреля 2020

Я решил не использовать 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)
...