Python QSqlTableModel установить фильтр

Serhio163

Новичок
Пользователь
Дек 7, 2021
12
0
1
Самара
Здравствуйте, помогите пожалуйста новичку...
есть sqlite база с двумя таблицами: Заказчики и Проекты.
таблицы связаны id заказчика -> колонка в проектах "заказчик"
на форме два Listview, на "sql_list_view" загружается список заказчиков из таблицы "Customers" (это работает)
Нужно загружать на "sql_list_view2" проекты из таблицы "Projects" с фильтром по выбранному на sql_list_view заказчику
И еще нужен второй фильтр по датам (колонка в таблице "Period" DATE, в таблице "Projects") от ... до...
form.model = QtSql.QSqlTableModel() form.model.setTable("Customers") form.model.select() form.sql_list_view.setModel(form.model) form.sql_list_view.setModelColumn(form.model.record().indexOf("Customer")) form.comboBox.setModel(form.model) form.comboBox.setModelColumn(form.model.record().indexOf("Customer")) form.model2 = QtSql.QSqlTableModel() form.model2.setTable("Projects") form.model2.select() form.sql_list_view2.setModel(form.model2) form.sql_list_view2.setModelColumn(form.model2.record().indexOf("Name")) def CustomerSelect(): pass def projSelect(): pass form.sql_list_view.selectionModel().selectionChanged.connect(CustomerSelect) form.sql_list_view2.selectionModel().selectionChanged.connect(projSelect)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Нужно загружать на "sql_list_view2" проекты из таблицы "Projects" с фильтром по выбранному на sql_list_view заказчику
Это можно сделать с помощью метода model.setFilter().
Примерно так:
заменить
Python:
form.sql_list_view.selectionModel().selectionChanged.connect(CustomerSelect)
на
Python:
form.sql_list_view.selectionModel().currentChanged.connect(CustomerSelect)
и в методе CustomerSelect фильтровать данные по customer = id с помощью model.setFilter():
Python:
def CustomerSelect(self, current, previous):
        filter = f'customer={current.data()}'
        form.model2.setFilter(filter)
это должно работать если в form.sql_list_view у вас выводятся id заказчиков.
 
Последнее редактирование:

Serhio163

Новичок
Пользователь
Дек 7, 2021
12
0
1
Самара
Это можно сделать с помощью метода model.setFilter()
Спасибо, разбираюсь
Можно доп вопрос?)
А как такой фильтр сделать из ComboBox? В нём список из этой же таблицы "Customers"
При выборе значения в comboBox у меня ничего не получается добиться.... только index смог достать)))
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
А как такой фильтр сделать из ComboBox?
Можно примерно так:
Python:
# привязываем обработчик для изменения индекса в комбобоксе
form.comboBox.currentIndexChanged.connect(CustomerSelect)


def CustomerSelect(self, value):
    # получаем запись в модели по индексу из комбобокса
    record = form.comboBox.model().record(value)
    # получаем id заказчика из записи
    customer_id = record.value(0)
    # фильтруем модель по id заказчика
    filter = f'''customer={customer_id}'''
    form.model2.setFilter(filter)
 

Serhio163

Новичок
Пользователь
Дек 7, 2021
12
0
1
Самара
это должно работать если в form.sql_list_view у вас выводятся id заказчиков
Ваш вариант не хочет работать (
Форма вообще не загружается...
В моих таблицах связь по id (в таблице "Projects" поле "Customer_id" содержит id (INTEGER) соответствующий id "Customers" , а не имя
Получилось вот так реализовать:
Python:
def CustomerSelect():
    index = form.sql_list_view.selectionModel().currentIndex()
    filter = index.sibling(index.row(), index.column()-1).data()
    form.model2.setFilter("Customer_id={}".format(filter))

   
form.sql_list_view.selectionModel().selectionChanged.connect(CustomerSelect)
 

Serhio163

Новичок
Пользователь
Дек 7, 2021
12
0
1
Самара
# привязываем обработчик для изменения индекса в комбобоксе form.comboBox.currentIndexChanged.connect(CustomerSelect)
Спасибище огромное!!! С комбо всё ништяк работает!
Вопрос с фильтром по заказчику закрыт!
Осталось фильтр по дате ... :rolleyes:
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Осталось фильтр по дате ...
Его можно сделать также с помощью model.setFilter.
Можно например сделать два поля (lineEdit) для задания интервала (от и до) и по ним фильтровать примерно так:
Python:
def CustomerSelect():
    index = form.sql_list_view.selectionModel().currentIndex()
    id_ = index.sibling(index.row(), index.column() - 1).data()

    # даты из полей на форме
    from_ = datetime.datetime.strptime(form.lineEdit.text(), "%Y-%m-%d")
    to_ = datetime.datetime.strptime(form.lineEdit_2.text(), "%Y-%m-%d")
        
    filter = f'''Customer_id={id_}
                 AND Period
                 BETWEEN '{from_}'
                 AND '{to_}' '''
    form.model2.setFilter(filter)

  
form.sql_list_view.selectionModel().selectionChanged.connect(CustomerSelect)
или для комбобокса
Python:
def CustomerSelect(self, value):
    # получаем запись в модели по индексу из комбобокса
    record = form.comboBox.model().record(value)
    # получаем id заказчика из записи
    customer_id = record.value(0)
    

    # даты из полей на форме
    from_ = datetime.datetime.strptime(form.lineEdit.text(), "%Y-%m-%d")
    to_ = datetime.datetime.strptime(form.lineEdit_2.text(), "%Y-%m-%d")
        
    filter = f'''Customer_id={customer_id}
                 AND Period
                 BETWEEN '{from_}'
                 AND '{to_}' '''
    # фильтруем модель по id заказчика и дате
    form.model2.setFilter(filter)


# привязываем обработчик для изменения индекса в комбобоксе
form.comboBox.currentIndexChanged.connect(CustomerSelect)
Нужно только проверить чтобы формат даты в базе совпадал с тем по которому будет производиться фильтрация.
 
  • Мне нравится
Реакции: Serhio163

Форум IT Специалистов