Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Model — klass va jadval
- 2.2. Maydon turlari
- 2.3. Maydon cheklovlari
- 2.4. __str__ metodi
- 2.5. Meta klassi
- 2.6. Model metodlari
- 2.7. Jadval nomi (avtomatik)
- 2.8. Model — ma'lumot poydevori
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Model va maydon turlari
- Misol 2 — Cheklovlar va standart qiymatlar
- Misol 3 — __str__, Meta va metodlar
- Misol 4 — Amaliy: to'liq model
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
21.3-dars: Model
21-QISM — DJANGO · 3-dars
1. Kirish va motivatsiya
Django loyiha tuzilmasini bildik. Endi eng muhim qismga — modelga o'tami. Model — ma'lumotning shakli: qaysi maydonlar, qanday turlar, qanday cheklovlar. Django'da model — Python klassi, va u bazadagi jadvalga mos keladi. Model yozsangiz, Django jadval yaratadi, ORM so'rovlarini beradi va admin panelga qo'shadi.
Model — Django ilovasining poydevori: butun ma'lumot uning atrofida quriladi. To'g'ri model — toza baza, oson so'rovlar, kam xato. Bu darsda model yaratishni, maydon turlarini, cheklovlarini va model metodlarini o'rganamiz.
Real vaziyat. Bir jamoa modelni ehtiyotsiz yozdi: narx CharField (matn!), sana CharField, hamma maydon null=True. Natijada narxni solishtirib bo'lmasdi (matn), sana bilan ishlash qiyin edi, bo'sh qiymatlar hisobotni buzdi. Tajribali dasturchi modelni qayta yozdi: narx DecimalField, sana DateField, aniq cheklovlar. Endi baza toza, so'rovlar to'g'ri, xatolar kam. To'g'ri model — ilovaning mustahkam poydevori.
Bu darsda modelni — maydon turlari, cheklovlar, Meta va metodlarini o'rganamiz.
Bu darsda:
- Model — klass va jadval
- Maydon turlari (
CharField,IntegerField, ...) - Maydon cheklovlari (
max_length,default,null) __str__metodiMetaklassi (ordering, verbose_name)- Model metodlari
- Jadval nomi (avtomatik)
- Amaliy: to'liq model
ℹ Misollarda Django standalone sozlanadi — odatda model
models.pyda yoziladi.
2. Nazariya — chuqur tushuntirish
2.1. Model — klass va jadval
Model — models.Modeldan meros olgan klass; u jadvalga mos:
from django.db import models
class Kurs(models.Model):
nom = models.CharField(max_length=100)
narx = models.IntegerField()| Model element | Bazada |
|---|---|
Klass Kurs |
Jadval app_kurs |
Maydon nom |
Ustun nom |
id (avtomatik) |
Birlamchi kalit (PK) |
Model klassi — jadval, maydonlar — ustunlar. id maydoni avtomatik qo'shiladi (birlamchi kalit). Django modeldan jadval sxemasini yaratadi (migratsiya, 21.4).
2.2. Maydon turlari
Har maydon turi bir ma'lumot turini beradi:
| Maydon | Ma'lumot |
|---|---|
CharField |
Qisqa matn (uzunlik bilan) |
TextField |
Uzun matn |
IntegerField |
Butun son |
DecimalField |
Aniq o'nlik (narx, pul) |
BooleanField |
True/False |
DateField / DateTimeField |
Sana / sana-vaqt |
EmailField |
Email (validatsiya bilan) |
nom = models.CharField(max_length=100)
narx = models.DecimalField(max_digits=8, decimal_places=2)
faol = models.BooleanField(default=True) To'g'ri maydon turi muhim: narx DecimalField (aniq pul), CharField emas (solishtirib bo'lmaydi). Tur — ma'lumot ma'nosini va amallarini belgilaydi.
2.3. Maydon cheklovlari
Maydonga qo'shimcha sozlamalar:
| Cheklov | Ma'no |
|---|---|
max_length |
Maksimal uzunlik (CharField) |
default |
Standart qiymat |
null |
Bazada NULL bo'lishi mumkin |
blank |
Formada bo'sh bo'lishi mumkin |
unique |
Takrorlanmas |
til = models.CharField(max_length=10, default="uz")
tavsif = models.TextField(blank=True, default="")
email = models.EmailField(unique=True) null — bazada (NULL), blank — formada (bo'sh). Matn maydonlarida null=True o'rniga default="" afzal (bo'sh matn, NULL emas). unique — takrorlanmaslik.
2.4. __str__ metodi
__str__ — modelning o'qiladigan ko'rinishi:
class Kurs(models.Model):
nom = models.CharField(max_length=100)
def __str__(self):
return self.nom __str__ — obyektni matn sifatida ko'rsatadi (admin panelda, printda, shellda). Usiz Kurs object (1) ko'rinadi; bilan — Python. Har modelda __str__ yozish — yaxshi amaliyot.
2.5. Meta klassi
Meta — model haqida metama'lumot:
class Kurs(models.Model):
nom = models.CharField(max_length=100)
narx = models.IntegerField()
class Meta:
ordering = ["-narx"] # standart tartib
verbose_name = "kurs" # o'qiladigan nom
verbose_name_plural = "kurslar"| Meta sozlama | Vazifa |
|---|---|
ordering |
Standart saralash |
verbose_name |
O'qiladigan nom (admin) |
db_table |
Jadval nomini o'zgartirish |
unique_together |
Bir necha maydon birgalikda unique |
Meta — model xatti-harakatini sozlaydi (tartib, nom, cheklovlar). ordering — barcha so'rovlarga standart saralash beradi.
2.6. Model metodlari
Modelga metod qo'shish mumkin (biznes mantiq):
class Kurs(models.Model):
narx = models.IntegerField()
def qimmatmi(self):
return self.narx > 100
def chegirmali_narx(self, foiz):
return self.narx * (1 - foiz / 100) Model metodlari — obyektga oid mantiq (qimmatmi, chegirmali_narx). Bu mantiqni modelda jamlaydi (ma'lumot bilan birga). "Semiz model" (fat model) — mantiq modelda, view yengil.
2.7. Jadval nomi (avtomatik)
Django jadval nomini avtomatik yaratadi:
app nomi + "_" + model nomi (kichik)
kurslar app + Kurs model → kurslar_kurs Jadval nomi kelishuvli (app_model). Meta.db_table bilan o'zgartirish mumkin, lekin odatda kerak emas (kelishuvga tayaning). Bu 21.1 dagi "kelishuv > sozlash".
2.8. Model — ma'lumot poydevori
Model butun ilovaning asosi:
| Modeldan | Kelib chiqadi |
|---|---|
| Jadval sxema | Migratsiya (21.4) |
| ORM so'rovlari | objects.filter(...) |
| Admin panel | Avtomatik UI (21.5) |
| Forma | ModelForm (21.8) |
| Serializer | DRF (21.13) |
Model — yagona manba (20.5 kabi): bir model'dan jadval, so'rov, admin, forma, serializer kelib chiqadi. To'g'ri model — butun ilovaning mustahkam poydevori.
3. Tez ma'lumotnoma
from django.db import models
class Kurs(models.Model):
nom = models.CharField(max_length=100) # qisqa matn
tavsif = models.TextField(blank=True, default="") # uzun matn
narx = models.DecimalField(max_digits=8, decimal_places=2) # pul
faol = models.BooleanField(default=True) # True/False
yaratilgan = models.DateTimeField(auto_now_add=True) # avto sana
email = models.EmailField(unique=True) # email
class Meta:
ordering = ["-narx"]
verbose_name = "kurs"
def __str__(self):
return self.nom
def qimmatmi(self):
return self.narx > 100Maydon turlari
CharField (max_length) · TextField · IntegerField · DecimalField
BooleanField · DateField · DateTimeField · EmailField4. Batafsil misollar
Misollarda Django standalone sozlanadi (odatda model
models.pyda).
Misol 1 — Model va maydon turlari
"""model klassi = jadval; maydon turlari (CharField, IntegerField, BooleanField, ...); id avtomatik; jadval nomi."""
import warnings
warnings.filterwarnings("ignore")
import sys
import tempfile
import types
import django
from django.conf import settings
settings.configure(
DEBUG=False,
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
INSTALLED_APPS=["wisar"],
DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()
from django.db import connection, models
class Kurs(models.Model):
nom = models.CharField(max_length=100)
narx = models.IntegerField()
faol = models.BooleanField(default=True)
tavsif = models.TextField(blank=True, default="")
class Meta:
app_label = "wisar"
def main() -> None:
with connection.schema_editor() as se:
se.create_model(Kurs)
print("=== 1. Maydonlar ===")
maydonlar = [f.name for f in Kurs._meta.get_fields()]
print(f" model maydonlari: {maydonlar}")
print("\n=== 2. id avtomatik (birlamchi kalit) ===")
k = Kurs.objects.create(nom="Python", narx=100)
print(f" yaratilgan id: {k.id}")
print("\n=== 3. Jadval nomi (avtomatik) ===")
print(f" jadval: {Kurs._meta.db_table}")
print("\n=== 4. Maydon turlari ===")
for f in Kurs._meta.get_fields():
if f.name != "id":
print(f" {f.name}: {type(f).__name__}")
print(" ⭐ model = jadval; maydon = ustun; id avtomatik PK")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Maydonlar ===
model maydonlari: ['id', 'nom', 'narx', 'faol', 'tavsif']
=== 2. id avtomatik (birlamchi kalit) ===
yaratilgan id: 1
=== 3. Jadval nomi (avtomatik) ===
jadval: wisar_kurs
=== 4. Maydon turlari ===
nom: CharField
narx: IntegerField
faol: BooleanField
tavsif: TextField
⭐ model = jadval; maydon = ustun; id avtomatik PKNima ko'rsatdi: 2.1, 2.2, 2.7-bo'limlar.
Misol 2 — Cheklovlar va standart qiymatlar
"""maydon cheklovlari (max_length, default, blank); standart qiymatlar; avto sana (auto_now_add); bo'sh matn."""
import warnings
warnings.filterwarnings("ignore")
import sys
import tempfile
import types
import django
from django.conf import settings
settings.configure(
DEBUG=False,
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
INSTALLED_APPS=["wisar"],
USE_TZ=True,
DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()
from django.db import connection, models
class Kurs(models.Model):
nom = models.CharField(max_length=100)
til = models.CharField(max_length=10, default="uz")
daraja = models.IntegerField(default=1)
tavsif = models.TextField(blank=True, default="")
faol = models.BooleanField(default=True)
yaratilgan = models.DateTimeField(auto_now_add=True)
class Meta:
app_label = "wisar"
def main() -> None:
with connection.schema_editor() as se:
se.create_model(Kurs)
print("=== 1. Standart qiymatlar (faqat nom berildi) ===")
k = Kurs.objects.create(nom="Python")
print(f" til (default): {k.til}, daraja (default): {k.daraja}")
print(f" faol (default): {k.faol}, tavsif (default): {k.tavsif!r}")
print("\n=== 2. Standartni almashtirish ===")
k2 = Kurs.objects.create(nom="Go", til="en", daraja=3)
print(f" til: {k2.til}, daraja: {k2.daraja}")
print("\n=== 3. Avto sana (auto_now_add) ===")
print(f" yaratilgan sana bor: {k.yaratilgan is not None}")
print("\n=== 4. max_length cheklovi ===")
nom_maydon = Kurs._meta.get_field("nom")
print(f" nom max_length: {nom_maydon.max_length}")
print(" ⭐ default — standart qiymat; auto_now_add — avto sana; blank — bo'sh")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Standart qiymatlar (faqat nom berildi) ===
til (default): uz, daraja (default): 1
faol (default): True, tavsif (default): ''
=== 2. Standartni almashtirish ===
til: en, daraja: 3
=== 3. Avto sana (auto_now_add) ===
yaratilgan sana bor: True
=== 4. max_length cheklovi ===
nom max_length: 100
⭐ default — standart qiymat; auto_now_add — avto sana; blank — bo'shNima ko'rsatdi: 2.3-bo'lim.
Misol 3 — __str__, Meta va metodlar
"""__str__ (o'qiladigan ko'rinish); Meta.ordering (standart saralash); model metodlari (biznes mantiq)."""
import warnings
warnings.filterwarnings("ignore")
import sys
import tempfile
import types
import django
from django.conf import settings
settings.configure(
DEBUG=False,
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
INSTALLED_APPS=["wisar"],
DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()
from django.db import connection, models
class Kurs(models.Model):
nom = models.CharField(max_length=100)
narx = models.IntegerField()
class Meta:
app_label = "wisar"
ordering = ["-narx"]
verbose_name = "kurs"
def __str__(self):
return f"{self.nom} ({self.narx} so'm)"
def qimmatmi(self):
return self.narx > 100
def chegirmali_narx(self, foiz):
return int(self.narx * (1 - foiz / 100))
def main() -> None:
with connection.schema_editor() as se:
se.create_model(Kurs)
Kurs.objects.create(nom="Python", narx=150)
Kurs.objects.create(nom="Go", narx=90)
Kurs.objects.create(nom="Rust", narx=200)
print("=== 1. __str__ (o'qiladigan) ===")
k = Kurs.objects.get(nom="Python")
print(f" str(kurs): {k}")
print("\n=== 2. Meta.ordering (standart -narx) ===")
print(f" tartib: {[x.nom for x in Kurs.objects.all()]}")
print("\n=== 3. Model metodi (qimmatmi) ===")
for x in Kurs.objects.all():
print(f" {x.nom}: qimmatmi={x.qimmatmi()}")
print("\n=== 4. Model metodi (chegirmali_narx) ===")
print(f" {k.nom} 20% chegirma: {k.chegirmali_narx(20)} so'm")
print(f" verbose_name: {Kurs._meta.verbose_name}")
print(" ⭐ __str__ o'qiladigan; Meta.ordering tartib; metod — biznes mantiq")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. __str__ (o'qiladigan) ===
str(kurs): Python (150 so'm)
=== 2. Meta.ordering (standart -narx) ===
tartib: ['Rust', 'Python', 'Go']
=== 3. Model metodi (qimmatmi) ===
Rust: qimmatmi=True
Python: qimmatmi=True
Go: qimmatmi=False
=== 4. Model metodi (chegirmali_narx) ===
Python 20% chegirma: 120 so'm
verbose_name: kurs
⭐ __str__ o'qiladigan; Meta.ordering tartib; metod — biznes mantiqNima ko'rsatdi: 2.4, 2.5, 2.6-bo'limlar.
Misol 4 — Amaliy: to'liq model
Real ilovadagi to'liq modelni quramiz: turli maydon turlari, cheklovlar, __str__, Meta va biznes metodlari bilan. Bu — professional Django modelining namunasi.
"""to'liq model: turli maydonlar, cheklovlar, __str__, Meta, biznes metodlari; ma'lumot poydevori."""
import warnings
warnings.filterwarnings("ignore")
import sys
import tempfile
import types
import django
from django.conf import settings
settings.configure(
DEBUG=False,
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
INSTALLED_APPS=["wisar"],
USE_TZ=True,
DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()
from django.db import connection, models
class Kurs(models.Model):
DARAJALAR = [("boshlangich", "Boshlang'ich"), ("orta", "O'rta"), ("yuqori", "Yuqori")]
nom = models.CharField(max_length=100)
tavsif = models.TextField(blank=True, default="")
narx = models.IntegerField(default=0)
daraja = models.CharField(max_length=20, choices=DARAJALAR, default="boshlangich")
faol = models.BooleanField(default=True)
yaratilgan = models.DateTimeField(auto_now_add=True)
class Meta:
app_label = "wisar"
ordering = ["nom"]
verbose_name = "kurs"
verbose_name_plural = "kurslar"
def __str__(self):
return self.nom
def bepulmi(self):
return self.narx == 0
def daraja_nomi(self):
return dict(self.DARAJALAR).get(self.daraja, self.daraja)
def main() -> None:
with connection.schema_editor() as se:
se.create_model(Kurs)
Kurs.objects.create(nom="Python asoslari", narx=0, daraja="boshlangich")
Kurs.objects.create(nom="Go dasturlash", narx=150, daraja="orta")
Kurs.objects.create(nom="Rust chuqur", narx=250, daraja="yuqori")
print("=== 1. To'liq model (choices bilan) ===")
for k in Kurs.objects.all():
print(f" {k.nom}: {k.daraja_nomi()}, {k.narx} so'm")
print("\n=== 2. Biznes metod (bepulmi) ===")
bepul = [k.nom for k in Kurs.objects.all() if k.bepulmi()]
print(f" bepul kurslar: {bepul}")
print("\n=== 3. choices (daraja tanlovlari) ===")
print(f" darajalar: {[d[0] for d in Kurs.DARAJALAR]}")
print("\n=== 4. Meta (ordering: nom) ===")
print(f" tartib (alifbo): {[k.nom for k in Kurs.objects.all()]}")
print(" ⭐ to'liq model — maydonlar + cheklovlar + metodlar (poydevor)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. To'liq model (choices bilan) ===
Go dasturlash: O'rta, 150 so'm
Python asoslari: Boshlang'ich, 0 so'm
Rust chuqur: Yuqori, 250 so'm
=== 2. Biznes metod (bepulmi) ===
bepul kurslar: ['Python asoslari']
=== 3. choices (daraja tanlovlari) ===
darajalar: ['boshlangich', 'orta', 'yuqori']
=== 4. Meta (ordering: nom) ===
tartib (alifbo): ['Go dasturlash', 'Python asoslari', 'Rust chuqur']
⭐ to'liq model — maydonlar + cheklovlar + metodlar (poydevor)Nima ko'rsatdi: 2.1–2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
"Narx CharField" |
Decimal"/IntegerField` (son) |
"id ni qo'lda qo'shish" |
Avtomatik (PK) |
"__str__ keraksiz" |
O'qiladigan ko'rinish |
"Matnga null=True" |
default="" afzal |
"null va blank bir xil" |
null — baza, blank — forma |
| "Mantiq view'da" | Model metodida (fat model) |
| "Jadval nomini yozish" | Avtomatik (app_model) |
| "Model faqat ma'lumot" | Metodlar ham (mantiq) |
6. Keng tarqalgan xatolar va yechimlari
1. Noto'g'ri maydon turi
narx = models.CharField(max_length=10) # ⚠️ solishtirib bo'lmaydi
narx = models.DecimalField(max_digits=8, decimal_places=2) # ✅2. __str__ yozmaslik
class Kurs(models.Model): ... # ⚠️ "Kurs object (1)"
def __str__(self): return self.nom # ✅3. Matnga null=True
tavsif = models.TextField(null=True) # ⚠️ NULL va "" ikki bo'sh
tavsif = models.TextField(blank=True, default="") # ✅4. max_length unutish (CharField)
nom = models.CharField() # ❌ max_length shart
nom = models.CharField(max_length=100) # ✅5. Mantiqni view'da
# view'da: if kurs.narx > 100 ... # ⚠️ takror
def qimmatmi(self): return self.narx > 100 # ✅ modelda6. choicessiz holat maydoni
daraja = models.CharField(max_length=20) # ⚠️ har qanday qiymat
daraja = models.CharField(choices=DARAJALAR) # ✅ cheklangan7. DecimalFieldga float
narx = models.FloatField() # ⚠️ pul uchun noaniq
narx = models.DecimalField(...) # ✅ aniq7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 21.2-dars (o'tilgan): app — modellar app ichida
- 21.4-dars: migratsiya — modeldan jadval
- 21.5-dars: admin — model → admin panel
- 21.9/21.10-dars: ORM — model so'rovlari, bog'lanishlar
- 20.5-dars (o'tilgan): Pydantic — model taqqoslash
8. Eng yaxshi amaliyotlar
To'g'ri maydon turini tanlang (narx —
DecimalField).Har modelga
__str__yozing.Matn maydonlarida
default=""(null=Trueemas).Meta.orderingbilan standart tartib bering.Biznes mantiqni model metodida jamlang (fat model).
choicesbilan holat maydonlarini cheklang.Jadval nomini avtomatik qoldiring (kelishuv).
CharFielddamax_lengthbering.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # model qanday klassdan meros oladi?
2. # id kim qo'shadi?
3. # CharField va TextField farqi?
4. # narx uchun qaysi maydon?
5. # __str__ nima qiladi?
6. # null va blank farqi?
7. # Meta.ordering nima?
8. # model metodi nima uchun?
9. # jadval nomi qanday?
10. # choices nima?
11. # default nima?
12. # auto_now_add nima?Javoblar
models.Model- Django (avtomatik, birlamchi kalit)
CharField— qisqa (uzunlik),TextField— uzunDecimalField(aniq pul) yokiIntegerField- Obyektning o'qiladigan ko'rinishi
null— bazada (NULL),blank— formada (bo'sh)- Standart saralash tartibi
- Obyektga oid biznes mantiq
- Avtomatik (
app_model) - Maydon uchun cheklangan tanlovlar
- Standart qiymat
- Yaratilganda avtomatik sana
Vazifa 2: Xatolarni tuzating
1. narx = models.CharField(max_length=10) # tur
2. class Kurs(models.Model): ... # __str__
3. tavsif = models.TextField(null=True) # matn null
4. nom = models.CharField() # max_length
5. daraja = models.CharField(max_length=20) # choicesJavoblar
1. narx = models.DecimalField(max_digits=8, decimal_places=2)
2. def __str__(self): return self.nom
3. tavsif = models.TextField(blank=True, default="")
4. nom = models.CharField(max_length=100)
5. daraja = models.CharField(max_length=20, choices=DARAJALAR)Vazifa 3: Mahsulot modeli
To'liq Mahsulot modeli:
- Maydonlar: nom, narx (
DecimalField), zaxira (IntegerField), faol __str__,Meta.ordering- Metodlar:
ombordami(),chegirma(foiz) - Standalone test
Vazifa 4: Foydalanuvchi profili
Profil modeli:
- ism, email (
unique), tug'ilgan sana (DateField) - bio (
TextField,blank) choicesbilan jins/holat__str__va metod
Vazifa 5: Maydon turlari to'plami
Har maydon turini sinang:
- Barcha asosiy turlar (Char, Text, Integer, Decimal, Boolean, Date, Email)
- Har biriga qiymat
- Cheklovlar (
max_length,default,unique) - Sxemani chiqarish
Vazifa 6: Biznes mantiqli model
Buyurtma modeli:
- Maydonlar: mahsulot, soni, narx
- Metodlar:
jami_narx(),chegirmali(),katta_buyurtmami() Metasozlamalari- Metodlarni test
Vazifa 7: O'ylash
Django modelida biznes mantiq model metodida (qimmatmi, chegirmali_narx) joylashadi — bu "semiz model, ozg'in view" (fat model, thin view) tamoyili. Muqobil — mantiqni view'da yozish ("ozg'in model, semiz view"). Mantiqni ma'lumotga yaqin (modelda) joylashtirishning afzalligi nima, va bu "ma'lumot va u bilan ishlovchi mantiq birga bo'lsin" tushunchasi (inkapsulyatsiya) qayerda yana uchraydi?
Javob
Qisqa javob: "Semiz model" — biznes mantiqni (narx hisobi, holat tekshiruvi) modelda (ma'lumotga yaqin) joylashtirish. Afzalligi: mantiq bir joyda (takror yo'q), ma'lumot bilan birga (obyektni to'liq biladi), qayta ishlatiladigan (har view undan foydalanadi). Agar mantiq view'da bo'lsa, u har view'da takrorlanadi va farqlanadi. "Ma'lumot va mantiq birga" — inkapsulyatsiya (OOP asosi): obyekt o'z ma'lumotini va u bilan ishlovchi amallarni birga saqlaydi. Bu model, klass, mikroservis — ko'p joyda uchraydi.
1. Semiz model vs semiz view
| Semiz model (yaxshi) | Semiz view (yomon) |
|---|---|
| Mantiq modelda | Mantiq view'da |
| Ma'lumotga yaqin | Ma'lumotdan uzoq |
| Qayta ishlatiladigan | Takrorlanadi |
| Bir joyda | Ko'p joyda |
2. Ma'lumotga yaqin mantiq afzalligi
| Afzallik | Sabab |
|---|---|
| Takror yo'q | Bir joyda (metod) |
| To'liq biladi | Obyekt ma'lumotiga kiradi |
| Qayta ishlatish | Har view undan |
| Test | Model alohida sinaladi |
3. Inkapsulyatsiya (OOP asosi)
Obyekt o'z ma'lumotini (maydonlar) va u bilan ishlovchi amallarni (metodlar) birga saqlaydi. Bu — mantiqni ma'lumotga yaqin qilishning OOP shakli.
4. "Ma'lumot + mantiq birga" boshqa joyda
| Daraja | Ma'lumot + mantiq |
|---|---|
| Django model | Maydon + metod |
| Klass | Atribut + metod |
| Mikroservis | Ma'lumot + xizmat |
| Modul | Holat + funksiya |
5. Muhandislik saboqlari
- Mantiqni ma'lumotga yaqin qil (modelda)
- Semiz model — takror yo'q, qayta ishlatiladigan
- Inkapsulyatsiya — ma'lumot + amal birga
- View yengil (faqat so'rov→javob boshqaruvi)
6. Xulosa
- Biznes mantiq — model metodida (semiz model)
- Ma'lumotga yaqin — takrorsiz, qayta ishlatiladigan
- Inkapsulyatsiya — ma'lumot + mantiq birga
- View yengil qolsin (mantiq modelda)
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda Django modelini o'rgandik.
Eng muhim uch fikr:
Model — klass va jadval. Model
models.Modeldan meros olgan klass; u bazadagi jadvalga mos (klass → jadval, maydon → ustun,idavtomatik birlamchi kalit). Maydon turlari ma'lumot turini belgilaydi:CharField(qisqa matn,max_lengthbilan),TextField(uzun),IntegerField/DecimalField(son, pul),BooleanField,DateField/DateTimeField,EmailField. To'g'ri tur muhim — narxDecimalField(aniq pul),CharFieldemas.Cheklovlar,
__str__vaMeta. Maydon sozlamalari:max_length,default(standart qiymat),null(bazada NULL),blank(formada bo'sh),unique(takrorlanmas),choices(cheklangan tanlov). Matn maydonlaridadefault=""afzal (null=Trueemas).__str__— obyektning o'qiladigan ko'rinishi (admin,print).Meta— model metama'lumoti:ordering(standart tartib),verbose_name,db_table.Model metodlari va poydevor. Modelga biznes mantiq metodlari qo'shiladi (
qimmatmi,chegirmali_narx) — "semiz model, ozg'in view": mantiq ma'lumotga yaqin (modelda), takrorsiz, qayta ishlatiladigan (inkapsulyatsiya). Model — yagona manba: bir model'dan jadval sxema (migratsiya), ORM so'rovlari, admin panel, forma, serializer kelib chiqadi. Jadval nomi avtomatik (app_model, kelishuv). To'g'ri model — butun ilovaning mustahkam poydevori.
Keyingi darsda migratsiyalar ni o'rganamiz: modeldan baza sxemasini yaratish va o'zgartirish — makemigrations, migrate, migratsiya fayllari va sxema evolyutsiyasi.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!