# Odoo Developer uchun Odoo Shell (Dasturchi sifatida bilishingiz kerak)

- Canonical: https://blog.bahromnajmiddinov.uz/blog/odoo-shell-dasturchilar-uchun
- Author: Bahrom Najmiddinov
- Published: 2026-02-05
- Odoo versions: 17.0, 18.0, 19.0
- Language: uz

> **TL;DR** Odoo Shell — Odoo backendiga Python konsoli orqali toʻgʻridan-toʻgʻri kirish vositasi. Unda env orqali yozuvlarni oʻqish, yaratish, oʻzgartirish, oʻchirish, sudo() va SQL bilan ishlash mumkin; maqola har birini misollar bilan koʻrsatadi.

<!-- Imported from Medium (https://medium.com/@bahromnajmiddinov/odoo-developer-uchun-odoo-shell-dasturchi-sifatida-bilishingiz-kerak-fcc609a28676) on 2026-10-23. Text is BAHA's; summary/description REVIEW. -->
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.

```bash
./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:

```python
env.user
```

Contextʼni koʻrish:

```python
env.context
```

## Maʼlumotlarni oʻqish (READ)

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

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

Agar faqat **bitta yozuv** kerak boʻlsa:

```python
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**.

```python
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:

```python
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:

```python
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.

## Yozuvni oʻchirish (UNLINK)

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

```python
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:

```python
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.

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

Yoki admin foydalanuvchi bilan ishlash:

```python
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**.

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

Agar SQL orqali maʼlumotni oʻzgartirsangiz:

```python
env.cr.commit()
```

## Model strukturasi va fieldlar

Model qanday fieldlardan iboratligini tez koʻrish mumkin:

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

Bitta field haqida batafsil maʼlumot:

```python
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:

```python
env.context.get('lang')
```

Boshqa til bilan ishlash:

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

## Debug uchun foydali tekshiruvlar

Model mavjudmi?

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

Tizimdagi barcha modellar:

```text
env.registry.models.keys()
```

Viewʼlarni tekshirish:

```python
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**
