baha.
Obuna boʻlish Buyurtma berish Aloqa

Odoo Developer uchun Odoo Shell (Dasturchi sifatida bilishingiz kerak)

Odoo Shell: backend ichiga toʻgʻridan-toʻgʻri kirib maʼlumotlarni oʻqish, yaratish, oʻzgartirish va metodlarni tekshirish boʻyicha amaliy qoʻllanma.

2 daqiqa oʻqish Oʻrnatish va DevOps Mos versiyalar: Odoo 17 · 18 · 19 Nashrlar: Community · Enterprise

Odoo bilan jiddiy ishlayotgan dasturchi payt kelib shuni tushunadi:
Odooʻdagi har bir narsani button, server action yoki API orqali tekshirib oʻtirish — sekin va koʻpincha ortiqcha murakkab boʻladi.

Baʼzan sizga backend ichiga toʻgʻridan-toʻgʻri kirib:

“Backendda nima gaplar oʻzi?”

degan savolga tez javob kerak boʻladi.

Ana shu joyda Odoo Shell oʻzini koʻrsatadi.

Odoo Shell nima?

Odoo Shell — bu Odooʻga ulangan oddiy Python interactive muhit.
Farqi shundaki, u sizga:

  • real database
  • real modellar
  • real biznes logika

bilan bevosita ishlash imkonini beradi.

Hech qanday qoʻshimcha kod yozmasdan, Odoo ichidagi deyarli hamma narsani tekshirib koʻrish mumkin.

Amaliyotda Odoo Shell asosan quyidagilar uchun ishlatiladi:

  • test qilish
  • debug qilish
  • maʼlumotlarni tekshirish
  • favqulodda holatlarda dataʼni toʻgʻrilash

Odoo Shellʼga kirish

Shellʼga kirish uchun Odooʻni qaysi konfiguratsiya va qaysi database bilan ishlatayotgan boʻlsangiz, shularni koʻrsatish kifoya.

Terminal window
./odoo-bin shell -c ./conf/odoo.conf -d my_database

Agar database nomi konfiguratsiya faylida koʻrsatilgan boʻlsa, -d flagni yozmasangiz ham boʻladi.

Shell ochilgandan keyin siz oddiy Python konsolini koʻrasiz, lekin u Odooʻga toʻliq ulangan boʻladi.

Shell ochilganda sizga nima beriladi?

Eng muhim obyekt — bu env.

Aslida, Odoo Shellʼni tushunish — bu****envʼni tushunish degani.

env orqali siz:

  • istalgan modelga kira olasiz
  • hozirgi foydalanuvchini bilasiz
  • contextʼni koʻrasiz
  • database bilan ishlaysiz

Misollar

Hozirgi foydalanuvchi:

env.user

Contextʼni koʻrish:

env.context

Maʼlumotlarni oʻqish (READ)

Oddiy misol. Ismi Asilbek boʻlgan barcha partnerlarni topamiz:

partners = env['res.partner'].search([('name', '=', 'Asilbek')])
for p in partners:
print(p.id, p.email)

Agar faqat bitta yozuv kerak boʻlsa:

partner = env['res.partner'].search([], limit=1)
partner.name

Bu yerda hech qanday SQL yozilmadi, lekin real databaseʼdan real maʼlumot oʻqildi.

Yozuv yaratish (CREATE)

Shellʼning eng kuchli joylaridan biri — yozuvni toʻgʻridan-toʻgʻri yaratish.

partner = env['res.partner'].create({
'name': 'Asilbek Test',
'email': 'asilbek@test.com',
'is_company': False,
})

⚠️ Bu yozuv hali tranzaksiya ichida turadi.
Agar shellʼdan chiqib ketsangiz, yoʻqolib ketishi mumkin.

Maʼlumot saqlanishini xohlasangiz:

env.cr.commit()

👉 Mana shu joyda koʻpchilik xato qiladi.
Commit qilmasangiz — oʻzgarish vaqtinchalik boʻladi.

Yozuvni oʻzgartirish (WRITE)

Mavjud yozuvni oʻzgartirish ham juda oson:

partner = env['res.partner'].browse(1)
partner.write({
'email': 'new@email.com'
})
env.cr.commit()

⚠️ browse() notoʻgʻri ID olsa, xatolik bermasligi mumkin.
Shuning uchun har doim natijani tekshirish — yaxshi odat.

Shellʼda oʻchirish juda xavfli boʻlishi mumkin. Chunki bu real record oʻchirish.

partner = env['res.partner'].browse(10)
partner.unlink()
env.cr.commit()

❗ Productionʼda buni ishlatishdan oldin ikki marta oʻylang.

Model methodlarini chaqirish

Shell faqat CRUD uchun emas. Siz istalgan model methodini ham chaqira olasiz.

Masalan, sale orderʼni tasdiqlash:

order = env['sale.order'].browse(5)
order.action_confirm()
env.cr.commit()

Bu UIʼda bosilgan “Confirm” tugmasi bilan deyarli bir xil natija beradi.

sudo() va foydalanuvchi bilan ishlash

Koʻp muammo access rights sababli chiqadi. Shellʼda buni tekshirish juda qulay.

env['res.partner'].sudo().search([], limit=5)

Yoki admin foydalanuvchi bilan ishlash:

admin_env = env(user=env.ref('base.user_admin'))
admin_env['res.partner'].search([], limit=5)

Bu orqali muammo kodda ekanmi yoki ruxsatlarda ekanini tez tushunish mumkin.

SQL bilan ishlash (env.cr)

Baʼzi hollarda ORM yetarli boʻlmaydi. Shellʼda SQL ham ishlaydi.

env.cr.execute("""
SELECT id, name
FROM res_partner
WHERE active = true
LIMIT 5
""")
env.cr.fetchall()

Agar SQL orqali maʼlumotni oʻzgartirsangiz:

env.cr.commit()

Model strukturasi va fieldlar

Model qanday fieldlardan iboratligini tez koʻrish mumkin:

env['res.partner'].fields_get().keys()

Bitta field haqida batafsil maʼlumot:

env['res.partner'].fields_get(['email'])

Bu ayniqsa yangi modul yoki begona model bilan ishlaganda juda foydali.

Context bilan ishlash

Context koʻp narsani oʻzgartiradi:

  • til
  • timezone
  • active_id va boshqalar

Tilni tekshirish:

env.context.get('lang')

Boshqa til bilan ishlash:

new_env = env(context=dict(env.context, lang='uz_UZ'))

Debug uchun foydali tekshiruvlar

Model mavjudmi?

env['ir.model'].search([('model', '=', 'res.partner')])

Tizimdagi barcha modellar:

env.registry.models.keys()

Viewʼlarni tekshirish:

env['ir.ui.view'].search([('model', '=', 'res.partner')])

env.cr.commit() haqida muhim haqiqat

Shell ichida create, write, unlink qilsangiz,
lekin****env.cr.commit() chaqirmasangiz — oʻzgarishlar vaqtinchalik boʻladi.

Shell yopilganda ular bekor qilinadi.

Lekin commit qilish ham har doim toʻgʻri emas. Chunki commit — bu qaytmas qaror. Ayniqsa production muhitda.

Asosiy qoida

Nima qilayotganingizni aniq tushunmasangiz — commit qilmang.

Kamina kamtarin,
Bahrom Najmiddinov

Yana oʻqing

Boʻlimlar