Django REST Framework-ning yuragi: Modellar, Serializerlar, ViewSetlar va marshrutlash
10-sinfAdvanced Python Back-end1-hafta · 3-darsTimeStampedModel, Category, Tag, Post va Comment modellarini yaratish.
ModelSerializer, Read va Write serializerlari, select_related va prefetch_related.
ModelViewSet, DefaultRouter va Browsable API orqali testlash.
NewsPortal ma'lumotlar bazasi jadvallari
Barcha modellar uchun umumiy yaratilgan va yangilangan vaqt tamoyili
# src/apps/common/models.py
from django.db import models
class TimeStampedModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True # Alohida jadval ochilmaydi
abstract = True kodi Djangoga bu modeldan faqat meros olish uchun foydalanishni buyuradi.
# src/apps/news/models.py (qisqartirilgan)
class Post(TimeStampedModel):
title = models.CharField(max_length=220)
slug = models.SlugField(max_length=240, unique=True)
body = models.TextField()
category = models.ForeignKey(
Category, on_delete=models.PROTECT, related_name="posts"
)
tags = models.ManyToManyField(Tag, blank=True, related_name="posts")
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super().save(*args, **kwargs)
Python obyektlari va JSON o'rtasidagi ko'prik
Serialization (Chiqarish) va Deserialization (Qabul qilish va tekshirish)
O'qish uchun: kategoriya va teglarning to'liq ma'lumotlari (nomi, slug) kerak.
{
"title": "Yangilik",
"category": { "id": 1, "name": "IT" }
}
Yozish uchun: mijozdan ortiqcha matn emas, faqat kategoriya ID raqami so'raladi.
{
"title": "Yangi post",
"category": 1
}
Ma'lumotlar bazasi so'rovlarini optimallashtirish
1 ta so'rov o'rniga 101 ta so'rov yuborilishi serverni "cho'ktiradi"
One-to-One va One-to-Many (ForeignKey) uchun ishlatiladi.
SQL JOIN orqali bitta so'rovda bog'laydi.
Many-to-Many va teskari bog'lanishlar uchun ishlatiladi.
Alohida 1 ta optimallashgan qo'shimcha so'rov yuboradi.
To'liq CRUD va avtomatik marshrutlash
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.select_related("category") \
.prefetch_related("tags").all()
lookup_field = "slug"
def get_serializer_class(self):
if self.action in ("create", "update", "partial_update"):
return PostWriteSerializer
if self.action == "retrieve":
return PostDetailSerializer
return PostListSerializer
1 qator kod 6 ta standart REST API marshrutini shakllantiradi
HTTP 200 OK
[
{
"id": 1,
"title": "Sun'iy intellekt kelajagi",
"slug": "suniy-intellekt-kelajagi",
"category": { "id": 2, "name": "IT" }
}
]
Bosing va tekshiring
Django modelini JSON ga va JSON ni modelga o'tkazuvchi qatlam.
Bosing va tekshiring
ForeignKey bog'lanishlarini 1 ta so'rov bilan olib keluvchi optimizator.
Bosing va tekshiring
Barcha CRUD endpointlarini avtomatik yaratib beruvchi vosita.
Nima uchun ManyToMany maydonlar uchun select_related emas, prefetch_related ishlatiladi?
PostListSerializer va PostWriteSerializer).
CategorySerializer va TagSerializer klasslarini yozing.
PostViewSet ni select_related bilan yozing va get_serializer_class ni ulang.
DefaultRouter orqali barcha ViewSetlarni ulab, Browsable API orqali dastlabki maqolani yarating.
Keyingi haftada: Foydalanuvchilarni boshqarish, Custom User, JWT va Ruxsatlar (Permissions) bilan ishlaymiz!