Django Rest Framework -2

Berkay Şen
4 min readFeb 1, 2022

Devam eğitimimizde ise sayfalama gibi yeni birkaç işlem öğrenelim. Sayfalama İşlemi Oluşturduğumuz PostListAPIView sınıfımızın içerisine girip bazı eklemeler yapalım.

Sayfalama İşlemi

Oluşturduğumuz PostListAPIView sınıfımızın içerisine girip bazı eklemeler yapalım.

class PostListAPIView(ListAPIView):
serializer_class = PostSerializer
pagination_class = PostPagination
def get_queryset(self):
queryset = PostModel.objects.filter(Draft=False)
return queryset

View sınıfımıza ek olarak pagination_class değişkenini ekledik ve buraya birazdan oluşturacak olduğumuz PostPagination sınıfının ismini verdim.

Bu sınıfı ise yine api klasörü içerisinde bir paginations.py dosyası oluşturarak verebiliriz.Hemen oluşturalım.

paginations.py dosyasını oluşturduktan sonra içerisine çok basit olarak bir sınıf yazalım.

from rest_framework.pagination import PageNumberPaginationclass PostPagination(PageNumberPagination):
page_size = 2

page_size değişkeni ile bir sayfada toplam kaç model gözükeceğini belirtiyoruz. Bu sayede bir sayfada 2 modelimiz gözükecektir.

Hemen admin panelinden birkaç post daha ekleyip API’mize bakalım.

Görselden de göreceğiniz üzere verilerimiz artık sayfa sayfa geliyor. JSON verilerimizi incelersek karşı tarafa önceki ve sonraki sayfaların da API url adreslerinin de gittiğini görebiliyoruz.

Sıralama ve Arama İşlemleri

Şimdi ise sıralama ve arama işlemlerini öğrenelim.Tekrardan views’imize bir değişken daha ekleyeceğiz.Hemen ekleyelim.

from rest_framework.filters import SearchFilter,OrderingFilter
class
PostListAPIView(ListAPIView):
serializer_class = PostSerializer
search_fields = [SearchFilter,OrderingFilter]
filter_backends = ["Title", "Content"]

pagination_class = PostPagination

def get_queryset(self):
queryset = PostModel.objects.filter(Draft=False)
return queryset

Arama yapacağımız fieldleri search_fields değişkeninin içerisine liste olarak veriyoruz.API’miz üzerinden bunları nasıl kullanacağımıza gelecek olursak

http://127.0.0.1:8000/api/post/list/?search=aranacakKelime

şeklinde arama işlemini yapabiliriz.Sıralama işlemi için ise

http://127.0.0.1:8000/api/post/list/?ordering=id

şeklinde yapabiliriz.

Post Detay Sayfası Yapma

Postlarımızın detay sayfası için views.py dosyamıza ayrı bir view sınıfı yazalım. Ancak bu listeleme gibi aynı sınıftan miras almayacak. Başka bir APIView sınıfından miras alacak.Hadi gelin yapalım.

from rest_framework.generics import RetrieveAPIViewclass PostDetailAPIView(RetrieveAPIView):
queryset = PostModel.objects.all()
serializer_class = PostDetailSerializer
lookup_field = 'Slug'

Burada yaptıklarımızı anlatacak olursak queryset ile bildiğiniz üzere verilerimizi belirliyoruz. Serializer_class ile de birazdan oluşturacak olduğumuz serializer sınıfının ismini belirtiyoruz ve ek olarak lookup_field ile hangi alana göre detay sayfasını yapacağımızı söylüyoruz.Bunu slug alanına göre yaptım ben.

Şimdi ise serializes.py dosyamızda ismini az önce oluşturduğumuz PostDetailSerializer sınıfımızı yazalım.

class PostDetailSerializer(serializers.ModelSerializer):
Author = serializers.SerializerMethodField()
def get_Author(self,obj):
return obj.Author.username
class Meta:
model = PostModel
fields = ["Author","Title","Content",'Draft','CreatedDate',
'ModifiedDate','Image']

Burada da yaptıklarımızı anlatacak olursak önceki eğitim modülünde anlattığımız gibi bir SerializerMethod tanımlayıp kullanıcının ID’si yerine kullanıcının username’inin karşı tarafa gitmesini ayarladım.

Şimdi ise api klasörü altındaki urls.py dosyasında URL path’imizi oluşturalım

urlpatterns = [
path("list/",PostListAPIView.as_view(),name="postList"), path("detail/<Slug>",PostDetailAPIView.as_view(),name="postDetail"),
]

Zaten önceki dersten list pathimiz bulunmakta.Ek olarak detail path’ini oluşturdum ve bu detay sayfasını oluşturduğumuz Slug alanına göre ayarladım. Tabii ki de oluşturduğumuz view’i de bu path’e tanımladım.

Şimdi ise detay sayfasına postumuzun Slug alanına göre gidelim.

http://127.0.0.1:8000/api/post/detail/rest-framework-dersleri

Gördüğünüz gibi başaralı bir şekilde gidebildik.Şimdi ise birkaç ayarlama yapalım. Tarih ayarı gibi…

class PostDetailSerializer(serializers.ModelSerializer):
Author = serializers.SerializerMethodField()
CreatedDate = serializers.SerializerMethodField(
method_name="get_CreatedDate")
ModifiedDate = serializers.SerializerMethodField(
method_name="get_ModifiedDate")

def get_CreatedDate(self, obj):
tarih = datetime.strftime(obj.CreatedDate, '%d/%m/%Y %H:%M:%S')
return str(tarih)

def get_ModifiedDate(self, obj):
tarih = datetime.strftime(obj.ModifiedDate, '%d/%m/%Y %H:%M:%S')
return str(tarih)

def get_Author(self,obj):
return obj.Author.username

class Meta:
model = PostModel
fields=["Author","Title","Content",'Draft','CreatedDate','ModifiedDate','Image']

Post Silme İşlemi

Post silme işlemi için ise yine views.py dosyamıza farklı bir view sınıfı yazacağız ve her zaman olduğu gibi bu farklı bir APIView’den miras alacak.

from rest_framework.generics import DestroyAPIViewclass PostDeleteAPIView(DestroyAPIView):
queryset = PostModel.objects.all()
serializer_class = PostSerializer
lookup_field = 'Slug'

Burada yaptığımız işlemler tamami ile aynı. lookup_field ile hangi alana göre silme işlemi yapacağımızı belirtiyoruz. Ben yine Slug alanına göre silme işlemini yapmayı tercih ettim. Oluşturduğumuz sınıf ise DestroyAPIViews sınıfından miras aldığı için silme işlemimiz başarıyla gerçekleşecektir. Tabi bunun öncesinde urls.py dosyamıza silme işlemleri için bir path tanımlamamız gerekiyor.Hemen oluşturalım

urlpatterns = [
path("list/",PostListAPIView.as_view(),name="postList"),
path("detail/<Slug>",PostDetailAPIView.as_view(),
name="postDetail"),
path("delete/<Slug>", PostDeleteAPIView.as_view(), name="postDelete"),
]

Gördüğünüz gibi bir delete işlemi için path oluşturduk ve Slug alanını bu path’e vermiş bulunduk.Şimdi ise bu API url’ine gidelim.

http://127.0.0.1:8000/api/post/delete/rest-framework-dersleri

Sağ üstte DELETE methodunu görüyorsunuz.Buradan DELETE butonuna basarak objemizi veritabanından silmeyi deneyelim.

Sildikten sonra Very:Accept olarak geri değer geldi. Yani işlemimiz başarı ile gerçekleşti. İstersek bunu veritabanından da kontrol edebiliriz.

--

--