когда добавляешь товар то создаётся кнопка с названием бренда, но она повторяется

Рейтинг: 0Ответов: 1Опубликовано: 25.04.2023

Когда добавляешь новый товар, то кнопка c названием бренда создаётся, даже если такая есть.

Помогите пожалуйста пофиксить, на скрине видна проблема, создались 2 кнопки "найк".

Код создания и вывода инлайн кнопок:

@dp.callback_query_handler(lambda c: c.data == 'shoes')
async def choose_brand(callback_query: types.CallbackQuery):
    items = [row[0] for row in db.cur.execute('SELECT brang FROM items').fetchall()]
    markup = InlineKeyboardMarkup(row_width=1)
    for brang in items:
        markup.add(InlineKeyboardButton(text=brang, callback_data=f"brand_{brang}"))
    await bot.send_message(callback_query.from_user.id, "Выберите бренд", reply_markup=markup)


@dp.callback_query_handler(lambda c: c.data.startswith('brand_'))
async def choose_model(callback_query: types.CallbackQuery):
    brang = callback_query.data.split('_')[1]
    items = [row[0] for row in db.cur.execute('SELECT model FROM items WHERE brang = ?', (brang,)).fetchall()]
    markup = InlineKeyboardMarkup(row_width=1)
    for model in items:
        markup.add(InlineKeyboardButton(text=model, callback_data=f"model_{model}"))
    await bot.send_message(callback_query.from_user.id, f"Выберите модель бренда {brang}", reply_markup=markup)


@dp.callback_query_handler(lambda c: c.data.startswith('model_'))
async def show_item(callback_query: types.CallbackQuery):
    model = callback_query.data.split('_')[1]
    # получение данных из таблицы
    db.cur.execute("SELECT model, price, brang, photo_it FROM items WHERE model = ?",
                   (model,))
    data = db.cur.fetchall()
    # форматирование данных в виде строки
    text = ''
    for row in data:
        text += f"model: {row[0]}\n price: {row[1]}\nbrend: {row[2]}"
        await bot.send_message(callback_query.from_user.id, text=text)
        await bot.send_photo(callback_query.from_user.id, photo=row[3])

введите сюда описание изображения

Ответы

▲ 0Принят

Добавил проверку на наличие уже существующей кнопки перед созданием. в sql запрос добавил DISTINCT, которое позволяет выбрать уникальные элементы из бд, если не подойдет - сотрешь.

if callback_query.data == 'shoes':
    # Получаем список уникальных брендов из базы данных
    brands = db.cur.execute('SELECT DISTINCT brand FROM items').fetchall()
    # Создаем список кнопок, пропуская бренды, которые уже есть в меню
    markup = InlineKeyboardMarkup()
    buttons = [InlineKeyboardButton(text=row[0], callback_data=f"brand_{row[0]}") for row in brands
               if not any(row[0] in button.text for button in markup.inline_keyboard)]
    # Если список кнопок не пустой, создаем разметку клавиатуры и отправляем сообщение пользователю
    if buttons:
        markup = markup.add(*buttons)
        await bot.send_message(callback_query.from_user.id, "Выберите бренд", reply_markup=markup)
    else:
        await bot.send_message(callback_query.from_user.id, "Все бренды уже добавлены")