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.pymodü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.Serializersınıfını miras almak yerineserializers.ModelSerializersınıfını miras almak olacak.LibraySerializersı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- Metasınıfında da hangi model sınıfını temsil ettiğini- model = Librarydiye belirterek sade ve daha gelişmiş bir- LibrarySerializersınıfı tanımladık.
- fieldskı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.pymodü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)methodundapkisimli bir parametre alacağı tanımlandı. Bu herhangi bir kütüphanenin(library)id'si yani veritabanındakiprimary key'i üzerinden o kütüphane ismine erişmek için eklendi.
- library = Library.objects.get(pk=pk)diyerek kendisine verilen- pkile istenen veriyi veritabanından alır ve- LibrarySerializer'a parametre olarak verilerek uygun formatta- Responseedilmesi sağlanır.
- Bu LibraryDetailsınıfına istekte bulunulması içinapitr/urls.pymodü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- integertipinde bir id veya primary key değeri verilirse yani- ..../libraries/3gibi 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/3URL'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.pymodülündeLibraryDetailsınıfınaputmethodunu 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/3adresine 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.pymodülündeLibraryDetailsı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/3adresine 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 veDELETEbutonunu da göreceksiniz. Silme işlemini delete butonuyla da yapabilirsiniz.
 
Yorumlar