ders2.md
D
jango R
est F
ramework 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