Django Rest Framework Dersleri-2

ders2.md

Django Rest Framework Notlarım

ModelSerializers

  • Önceki blog yazımızda (drf giriş) kısa bir giriş yapmış ve get & post isteklerine cevap verecek bir uygulama yazmıştık.
  • Bu dersimizde apitr/serializers.py modülündeki serializer sınıfını daha sade ve gelişmiş şekilde kullanacağız.
  • Eski serializer aşağıdaki gibidir.
... class LibrarySerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField(max_length=100) def create(self, validated_data): return Library.objects.create(**validated_data)
  • Şimdi üzerinde değişiklikler yapalım. İlk olarak yapmamız gereken serializers.Serializer sınıfını miras almak yerine serializers.ModelSerializer sınıfını miras almak olacak. LibraySerializer sınıfını aşağıdaki gibi değiştirelim.
... class LibrarySerializer(serializers.ModelSerializer): class Meta: model = Library fields = ('id','name') #fields = '__all__'
  • ModelSerializer'ı miras aldığı ve Meta sınıfında da hangi model sınıfını temsil ettiğini model = Library diye belirterek sade ve daha gelişmiş bir LibrarySerializer sınıfı tanımladık.
  • fields kısmında göstermek istediğimiz sınıf alanlarını/özelliklerini belirtiyoruz. '__all__' diyerek hepsini göstermek istediğimizi kısaca belirtiyoruz.
  • Yeniden http://127.0.0.1:8000/apitr/libraries/'e GET & POST isteklerinde bulunursanız aynı şekilde uygulamanın çalıştığını göreceksiniz.

Retrieve, Update, Delete

Retrieve
  • apitr/views.py modülüne aşağıdaki sınıfı da (LibraryDetail) ekleyelim
class LibraryList(APIView): def get(self, request, format=None): ... def post(self, request, format=None): ... class LibraryDetail(APIView): def get(self, request, pk, format=None): library = Library.objects.get(pk=pk) serializer = LibrarySerializer(library) return Response(serializer.data)
  • Görüldüğü gibi get(self, request, pk, format=None) methodunda pk isimli bir parametre alacağı tanımlandı. Bu herhangi bir kütüphanenin(library) id'si yani veritabanındaki primary key'i üzerinden o kütüphane ismine erişmek için eklendi.
  • library = Library.objects.get(pk=pk) diyerek kendisine verilen pk ile istenen veriyi veritabanından alır ve LibrarySerializer'a parametre olarak verilerek uygun formatta Response edilmesi sağlanır.
  • Bu LibraryDetail sınıfına istekte bulunulması için apitr/urls.py modülüne bir tane URL daha ekleyelim.
from apitr.apiviews import LibraryList, LibraryDetail urlpatterns = [ path('libraries/', LibraryList.as_view()), path('libraries/<int:pk>', LibraryDetail.as_view()), # dikkat ]
  • libraries/<int:pk> diyerek browser üzerinde integer tipinde bir id veya primary key değeri verilirse yani..../libraries/3 gibi bir URL'ye istek yapılırsa yani 3 no'lu id istenirse diye bu url'e uygun tanımlama yapıyoruz.
  • LibraryDetail.as_view() diyerek de sınıfımızı view olarak belirtmiş oluyoruz.
  • Eğer browser'dan http://127.0.0.1:8000/apitr/libraries/3 URL'sine istek yaparsanız aşağıdaki gibi bir sonuç alırsınız:
HTTP 200 OK Allow: GET, HEAD, OPTIONS Content-Type: application/json Vary: Accept { "id": 3, "name": "Endülüs" }
Update
  • Şimdi put işlemi için apitr/views.py modülünde LibraryDetail sınıfına put methodunu ekleyelim.
class LibraryDetail(APIView): def get(self, request, pk, format=None): ... def put(self, request, pk, format=None): library = Library.objects.get(pk=pk) serializer = LibrarySerializer(library, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  • Methodu ekledikten sonra http://127.0.0.1:8000/apitr/libraries/3 adresine giderseniz PUT request yapacağınız alan açılır veya curl, postman üzerinden de bu işlemi gerçleştirebilirsiniz. Hedef URL verilen bu URL olacak ve göndereceğiniz güncel data şu şekilde olmalıdır: { "name": "Endülüs 2019"}. JSON formatında veriyi PUT request ile güncellemek istediğimizde başarıyla verinin güncellendiğini göreceksiniz.
HTTP 200 OK Allow: GET, POST, HEAD, OPTIONS Content-Type: application/json Vary: Accept [ { "id": 3, "name": "Endülüs 2019" }, { "id": 4, "name": "Bağdat" }, { "id": 5, "name": "İstanbul" } ]
Delete
  • Silme işlemi için apitr/views.py modülünde LibraryDetail sınıfını aşağıdaki gibi düzenleyelim
class LibraryDetail(APIView): def get(self, request, pk, format=None): ... def put(self, request, pk, format=None): ... def delete(self, request, pk, format=None): library = Library.objects.get(pk=pk) library.delete() return Response(status=status.HTTP_204_NO_CONTENT)
  • Methodu ekledikten sonra http://127.0.0.1:8000/apitr/libraries/3 adresine postman, curl ile istekte bulunup silme işlemini gerçekleştirebilirsiniz. Veya bu adresi browser ile açtığınızda id'si 3 olan kütüphanenin detayını göreceksiniz ve DELETE butonunu da göreceksiniz. Silme işlemini delete butonuyla da yapabilirsiniz.

Yorumlar