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')
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()),
]
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