IlmHamroh
Python kursi/Django3/16-dars16 daqiqa
Mundarija (22)

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__ metodi
  • Meta klassi (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:

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

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

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

python
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

python
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 > 100

Maydon turlari

CharField (max_length) · TextField · IntegerField · DecimalField
BooleanField · DateField · DateTimeField · EmailField

4. Batafsil misollar

Misollarda Django standalone sozlanadi (odatda model models.pyda).

Misol 1 — Model va maydon turlari

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

text
=== 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 PK

Nima ko'rsatdi: 2.1, 2.2, 2.7-bo'limlar.

Misol 2 — Cheklovlar va standart qiymatlar

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

text
=== 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'sh

Nima ko'rsatdi: 2.3-bo'lim.

Misol 3 — __str__, Meta va metodlar

python
"""__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:

text
=== 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 mantiq

Nima 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.

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

text
=== 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

python
narx = models.CharField(max_length=10)      # ⚠️ solishtirib bo'lmaydi
narx = models.DecimalField(max_digits=8, decimal_places=2)   # ✅

2. __str__ yozmaslik

python
class Kurs(models.Model): ...                # ⚠️ "Kurs object (1)"
def __str__(self): return self.nom           # ✅

3. Matnga null=True

python
tavsif = models.TextField(null=True)         # ⚠️ NULL va "" ikki bo'sh
tavsif = models.TextField(blank=True, default="")   # ✅

4. max_length unutish (CharField)

python
nom = models.CharField()                     # ❌ max_length shart
nom = models.CharField(max_length=100)       # ✅

5. Mantiqni view'da

python
# view'da: if kurs.narx > 100 ...            # ⚠️ takror
def qimmatmi(self): return self.narx > 100   # ✅ modelda

6. choicessiz holat maydoni

python
daraja = models.CharField(max_length=20)     # ⚠️ har qanday qiymat
daraja = models.CharField(choices=DARAJALAR) # ✅ cheklangan

7. DecimalFieldga float

python
narx = models.FloatField()                   # ⚠️ pul uchun noaniq
narx = models.DecimalField(...)              # ✅ aniq

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

  1. To'g'ri maydon turini tanlang (narx — DecimalField).

  2. Har modelga __str__ yozing.

  3. Matn maydonlarida default="" (null=True emas).

  4. Meta.ordering bilan standart tartib bering.

  5. Biznes mantiqni model metodida jamlang (fat model).

  6. choices bilan holat maydonlarini cheklang.

  7. Jadval nomini avtomatik qoldiring (kelishuv).

  8. CharFieldda max_length bering.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
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
  1. models.Model
  2. Django (avtomatik, birlamchi kalit)
  3. CharField — qisqa (uzunlik), TextField — uzun
  4. DecimalField (aniq pul) yoki IntegerField
  5. Obyektning o'qiladigan ko'rinishi
  6. null — bazada (NULL), blank — formada (bo'sh)
  7. Standart saralash tartibi
  8. Obyektga oid biznes mantiq
  9. Avtomatik (app_model)
  10. Maydon uchun cheklangan tanlovlar
  11. Standart qiymat
  12. Yaratilganda avtomatik sana

Vazifa 2: Xatolarni tuzating

python
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)  # choices
Javoblar
python
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:

  1. Maydonlar: nom, narx (DecimalField), zaxira (IntegerField), faol
  2. __str__, Meta.ordering
  3. Metodlar: ombordami(), chegirma(foiz)
  4. Standalone test

Vazifa 4: Foydalanuvchi profili

Profil modeli:

  1. ism, email (unique), tug'ilgan sana (DateField)
  2. bio (TextField, blank)
  3. choices bilan jins/holat
  4. __str__ va metod

Vazifa 5: Maydon turlari to'plami

Har maydon turini sinang:

  1. Barcha asosiy turlar (Char, Text, Integer, Decimal, Boolean, Date, Email)
  2. Har biriga qiymat
  3. Cheklovlar (max_length, default, unique)
  4. Sxemani chiqarish

Vazifa 6: Biznes mantiqli model

Buyurtma modeli:

  1. Maydonlar: mahsulot, soni, narx
  2. Metodlar: jami_narx(), chegirmali(), katta_buyurtmami()
  3. Meta sozlamalari
  4. 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

  1. Mantiqni ma'lumotga yaqin qil (modelda)
  2. Semiz model — takror yo'q, qayta ishlatiladigan
  3. Inkapsulyatsiya — ma'lumot + amal birga
  4. View yengil (faqat so'rov→javob boshqaruvi)

6. Xulosa

  1. Biznes mantiq — model metodida (semiz model)
  2. Ma'lumotga yaqin — takrorsiz, qayta ishlatiladigan
  3. Inkapsulyatsiya — ma'lumot + mantiq birga
  4. View yengil qolsin (mantiq modelda)

Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.


Xulosa

Bu darsda Django modelini o'rgandik.

Eng muhim uch fikr:

  1. Model — klass va jadval. Model models.Modeldan meros olgan klass; u bazadagi jadvalga mos (klass → jadval, maydon → ustun, id avtomatik birlamchi kalit). Maydon turlari ma'lumot turini belgilaydi: CharField (qisqa matn, max_length bilan), TextField (uzun), IntegerField/DecimalField (son, pul), BooleanField, DateField/DateTimeField, EmailField. To'g'ri tur muhim — narx DecimalField (aniq pul), CharField emas.

  2. Cheklovlar, __str__ va Meta. Maydon sozlamalari: max_length, default (standart qiymat), null (bazada NULL), blank (formada bo'sh), unique (takrorlanmas), choices (cheklangan tanlov). Matn maydonlarida default="" afzal (null=True emas). __str__ — obyektning o'qiladigan ko'rinishi (admin, print). Meta — model metama'lumoti: ordering (standart tartib), verbose_name, db_table.

  3. 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.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
21.3-dars: Model — IlmHamroh