ders5.md
D
jango R
est F
ramework Notlarım
Relational Operations
(İlişkisel Operasyonlar)
- Bu dersimizde
Book
adında bir model class daha ekleyeceğiz. Her kitap bir kütüphaneye ait olacak ve her kütüphanede birden fazla kitap bulunabilecek şekilde model sınıflarını tanımlayıp ilişkilendireceğiz.
apitr/model.py
içerisini aşağıdaki gibi düzenleyelim
class Library(models.Model):
name = models.CharField(max_length=120)
class Meta:
db_table = 'library'
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=120)
library = models.ForeignKey(Library, on_delete=models.CASCADE, null=True)
class Meta:
db_table = 'book'
def __str__(self):
return self.name
- Gördüğünüz üzere Book sınıfının name adında ve library adında iki adet alanı bulunuyor.
library
alanı hangi kütüphaneye ait ise bu kitap onun referans alanı olacaktır.
- Terminalden aşağıdaki komutları vererek model sınıfını veritabanına gönderelim.
(env) adnan@ce:~/arge/drf/trdrf$ python manage.py makemigrations apitr
Migrations for 'apitr':
apitr/migrations/0004_book_library.py
- Add field library to book
(env) adnan@ce:~/arge/drf/trdrf$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, apitr, auth, contenttypes, sessions
Running migrations:
Applying apitr.0004_book_library... OK
(env) adnan@ce:~/arge/drf/trdrf$ python manage.py runserver
...
.....
- Şimdi
Book
modeli için uygun serializer classını yazalım. apitr/serializers.py
modülünü açıp aşağıdaki sınıfı ekliyoruz.
from apitr.models import Library, Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('id', 'name', 'library')
- Şimdi
Book
sınıfı için views sınıflarını yazalım. apitr/views.py
modülünü açıp aşağıdaki sınıfları ekliyoruz.
from apitr.models import Library, Book
from apitr.serializers import LibrarySerializer
from apitr.serializers import BookSerializer
class LibraryList(generics.ListCreateAPIView):
...
class LibraryDetail(generics.RetrieveUpdateDestroyAPIView):
...
class BookList(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
- Şimdi URL tanımını yapalım.
apitr/urls.py
modülünü açıp aşağıdaki satırları ekleyelim.
from apitr.apiviews import BookList, BookDetail
urlpatterns = [
path('libraries/', LibraryList.as_view()),
path('libraries/<int:pk>', LibraryDetail.as_view()),
path('books/', BookList.as_view()),
path('books/<int:pk>', BookDetail.as_view()),
]
- Şimdi uyguladığımız sınıflar için CRUD(Create, Retrieve, Update, Delete) işlemlerini gerçekleştirelim.
- Tarayıcınızı açıp
http://127.0.0.1:8000/apitr/books/
adresinizi yazarsanız en altta Name
ve Library
alanlarını göreceksiniz. Daha önce eklediğiniz Library
kayıtları dropdown(combobox) içerisinde listelenir. Name alanına da istediğiniz kitap ismini verip kaydı gerçekleştirebilirsiniz.
- Postman kullanarak da aşağıdaki gibi üstteki URL adresine POST request yapabilirsiniz.
{
"library":6,
"name" : "Kitab-ul Ekber"
}
- Burada id'si 6 olan kütüphaneyi ve kitabın ismini veriyoruz. Dönen cevap:
{
"id": 3,
"name": "Kitab-ul Ekber",
"library": 6
}
http://127.0.0.1:8000/apitr/books/3
adresine de PUT DELETE isteklerini yapabilirsiniz.
- Örnek PUT request
{
"name": "Fıkh-ul Ekber, İmam-ı Azam Ebu Hanife",
"library": 6
}
{
"id": 3,
"name": "Fıkh-ul Ekber, İmam-ı Azam Ebu Hanife",
"library": 6
}
Yorumlar