- virtual muhitni yaratamiz 💻
py -m venv venv
- virtual muhitni aktivlashtiramiz
venv\Scripts\activate
- kerakli kutubxonalarni o'rnatamiz 📚
pip install djangorestframework
pip install djoser
- django proyekt yaratamiz
django-admin startproject config .
- proyektimiz uchun app yaratamiz
py manage.py startapp post
settings.py
ni sozlab olamiz:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'post', # new
'rest_framework', # new
'rest_framework.authtoken', # new
'djoser' # new
]
...
LANGUAGE_CODE = 'uz'
TIME_ZONE = 'Asia/Tashkent'
...
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
]
}
post/models.py
ichida modelimizni yaratib olamiz
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
phone = models.CharField(max_length=20, blank=True, null=True)
bio = models.TextField(blank=True, null=True)
class PostModel(models.Model):
title = models.CharField(max_length=250)
content = models.TextField(blank=True, null=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
verbose_name = 'Post'
verbose_name_plural = 'Post'
ordering = ['-created']
def __str__(self):
return self.title
7.1 Modelimizni yaratgandan so'ng migratisiya hosil qilamiz
py manage.py makemigrations
7.2 So'ngra migratisiya qilamiz
py manage.py migrate
7.3 Super userimizni yaratamiz
py manage.py createsuperuser
User
ni o'zgartirganimiz sabablisettings.py
gaAUTH_USER_MODEL = 'post.User'
ni qo'shamiz
AUTH_USER_MODEL = 'post.User'
post/serializers.py
yaratib olib quyidagi kodni yozamiz
from rest_framework import serializers
from .models import PostModel
class PostSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(default=serializers.CurrentUserDefault()) # user mizni yashirib unga aktiv bo'lgan foydalanuvchini o'rnatish uchun
author = serializers.ReadOnlyField(source='user.username') # avtor maydoni yaratib unga userni qiymatini beramiz get requestda ko'rib turish uchun
class Meta:
model = PostModel
fields = '__all__'
- O'zmizning premissionlarni o'rnatish uchun
post/permissions.py
ni yaratamiz
from rest_framework import permissions
class IsAdminOrReadOnly(permissions.BasePermission):
def has_permission(self, request, view): # foydalanuvchiga permissions berish uchun
if request.method in permissions.SAFE_METHODS:
return True
return bool(request.user and request.user.is_staff)
class IsOwnerOrReadOnly(permissions.BasePermission): # obyektga permissions berish uchun
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.user == request.user
post/views.py
from django.shortcuts import render
from .models import PostModel
from .serializers import PostSerializer
from rest_framework.generics import (ListCreateAPIView,
RetrieveUpdateDestroyAPIView)
from rest_framework.permissions import IsAuthenticated
from .permissions import IsOwnerOrReadOnly
class PostAPI(ListCreateAPIView):
queryset = PostModel.objects.all()
serializer_class = PostSerializer
permission_classes = (IsAuthenticated,)
class PostDetail(RetrieveUpdateDestroyAPIView):
queryset = PostModel.objects.all()
serializer_class = PostSerializer
permission_classes = (IsOwnerOrReadOnly,)
- post/urls.py ni yaratin olamiz
from django.urls import path
from .views import PostAPI, PostDetail
urlpatterns = [
path('api/v1/posts', PostAPI.as_view()),
path('api/v1/post/<int:pk>', PostDetail.as_view()),
]
config/urls.py
gapath('', include('post.urls'))
ni yozamiz
from django.contrib import admin
from django.urls import path, include, re_path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('post.urls')), # new
path('auth-drf', include('rest_framework.urls')), # new
re_path(r'^auth/', include('djoser.urls')), # new
re_path(r'^auth/', include('djoser.urls.authtoken')), # new
]
- proyektimizni ishga tushuramiz
py manage.py runserver