สร้าง CRUD REST API ด้วยมุมมองแบบคลาสใน Django REST Framework
Django Rest Framework (DRF) เป็นเฟรมเวิร์ก Django ที่ให้การสนับสนุนสำหรับการสร้าง REST API เช่นเดียวกับ Django DRF ช่วยให้คุณสร้างมุมมอง API ของคุณด้วยมุมมองตามฟังก์ชันหรือตามคลาส
แม้ว่ามุมมองตามชั้นเรียนอาจนำเสนอช่วงการเรียนรู้ที่สูงชันในช่วงแรก แต่ก็มีข้อดีหลายประการ เช่น การจัดระเบียบโค้ดที่ได้รับการปรับปรุง ความเป็นโมดูลที่เพิ่มขึ้นผ่านการสืบทอด ความสามารถในการนำกลับมาใช้ใหม่ที่ได้รับการปรับปรุง และความกระชับในการแสดงออก
สร้าง Recipe Manager API ด้วย Django REST Framework
แอปพลิเคชันการจัดการสูตรอาหารทำหน้าที่เป็นแพลตฟอร์มที่ยอดเยี่ยมสำหรับการสำรวจมุมมองตามคลาสภายใน Django Rest Framework (DRF) ด้วยการรวมคุณสมบัติต่างๆ เช่น การสร้าง การแก้ไข และการกำจัดสูตรอาหาร จะทำให้เราสามารถเข้าใจการใช้งานฟังก์ชัน CRUD (สร้าง อ่าน อัปเดต ลบ) ได้ คู่มือนี้จะแนะนำคุณเกี่ยวกับการออกแบบอินเทอร์เฟซ CRUD ผ่านชุดขั้นตอนตามลำดับ
ซอร์สโค้ดสำหรับบทช่วยสอนนี้พร้อมให้เข้าถึงและดาวน์โหลดได้จากแพลตฟอร์ม GitHub ซึ่งทำหน้าที่เป็นศูนย์กลางสำหรับนักพัฒนาในการทำงานร่วมกันและแบ่งปันงานของพวกเขากับผู้อื่นในรูปแบบของแหล่งเก็บข้อมูลโอเพ่นซอร์ส
ขั้นตอนที่ 1: ติดตั้ง Django REST Framework และกำหนดค่าโครงการของคุณ
⭐ สร้างสภาพแวดล้อมเสมือนสำหรับโปรเจ็กต์ของคุณและติดตั้งการขึ้นต่อกันต่อไปนี้:
pip install django djangorestframework
⭐ สร้างโปรเจ็กต์ Django ชื่อ core ด้วยคำสั่งต่อไปนี้:
django-admin startproject core .
⭐ สร้างแอปชื่อ Recipe_manager:
python manage.py startapp recipe_manager
⭐ เปิดไฟล์ core/settings.py ของคุณแล้วไปที่รายการ INSTALLED_APPS เพื่อลงทะเบียนแอปของคุณ:
INSTALLED_APPS = [
# custom apps
'rest_framework',
'recipe_manager',
]
ขั้นตอนที่ 2: สร้างแบบจำลองสำหรับแอปสูตรอาหารของคุณ
⭐ เปิดไฟล์ Recipe_manager/models.py ของคุณและสร้างโมเดลสำหรับแอปของคุณ นี่คือตัวอย่างพื้นฐานของแบบจำลองสูตรอาหาร:
# models.py
from django.db import models
class Recipe(models.Model):
recipe_name = models.CharField(max_length=255)
ingredients = models.TextField()
instructions = models.TextField()
⭐ สร้างการโยกย้ายและย้ายโมเดลของคุณไปยังฐานข้อมูลด้วยคำสั่งนี้:
python manage.py makemigrations && python manage.py migrate
ขั้นตอนที่ 3: สร้าง Serializer สำหรับแอปของคุณ
ซีเรียลไลเซอร์ทำหน้าที่เป็นส่วนสำคัญของเฟรมเวิร์ก Django ซึ่งอำนวยความสะดวกในการแปลงโครงสร้างข้อมูลที่ซับซ้อน รวมถึงชุดคิวรี ให้เป็นรูปแบบที่เหมาะสมสำหรับการเรนเดอร์ ครอบคลุมตัวอย่าง เช่น JSON หรือ XML
หากต้องการสร้างซีเรียลไลเซอร์ ให้ทำตามขั้นตอนเหล่านี้:
⭐สร้างไฟล์ชื่อrecipe_manager/serializers.py
⭐ นำเข้าโมดูลซีเรียลไลเซอร์รวมถึงโมเดลที่คุณต้องการทำให้เป็นซีเรียลไลซ์:
# serializers.py
from rest_framework import serializers
from .models import Recipe # the model to serialize
⭐ ในไฟล์เดียวกัน ให้สร้างคลาสซีเรียลไลเซอร์สำหรับโมเดลของคุณและกำหนดคลาส Meta ในนั้น:
# serializers.py
class RecipeSerializer(serializers.ModelSerializer):
class Meta:
model = Recipe
fields = ('recipe_name', 'ingredients', 'instructions')
ในโค้ดนี้ คลาส Meta จะกำหนดโมเดลเพื่อทำให้ซีเรียลไลซ์และฟิลด์เฉพาะที่ซีเรียลไลเซอร์ควรจัดการ แอตทริบิวต์ของเขตข้อมูลอาจเป็นรายการหรือทูเปิลก็ได้ หากคุณต้องการซีเรียลไลซ์ฟิลด์ทั้งหมดในโมเดลของคุณ คุณสามารถทำได้ดังนี้:
class Meta:
fields = "__all__"
ขั้นตอนที่ 4: เขียนมุมมองสำหรับการดำเนินการ CREATE
คุณสามารถสร้างมุมมองตามคลาสสำหรับแอปของคุณได้โดยการนำเข้ามุมมองทั่วไปที่มีอยู่ใน Django คุณสามารถอ่านเกี่ยวกับมุมมองเหล่านี้ได้จาก เอกสารอย่างเป็นทางการของ Django หากต้องการใช้การดำเนินการ CREATE ของ CRUD คุณควรนำเข้า CreateAPIView คุณควรนำเข้าซีเรียลไลเซอร์และโมเดลของคุณ:
# views.py
from rest_framework.generics import CreateAPIView
from .models import Recipe
from .serializers import RecipeSerializer
เพื่อบังคับใช้กระบวนการสร้างเอนทิตีใหม่ภายในมุมมองเฉพาะโดยใช้ REST API สิ่งที่ต้องทำทั้งหมดคือการกำหนดวิธีการทำให้เป็นอนุกรมเฉพาะที่มุมมองควรใช้ ตัวอย่างที่แสดงให้เห็นสิ่งนี้สามารถสังเกตได้ดังนี้:
# Create view
class RecipeCreateView(CreateAPIView):
serializer_class = RecipeSerializer
การใช้การกำหนดค่านี้ทำให้สามารถดำเนินการคำขอ POST ไปยังแอปพลิเคชันของคุณได้
ขั้นตอนที่ 5: เขียนมุมมองสำหรับการดำเนินการอ่าน
⭐ หากต้องการดำเนินการอ่าน ให้นำเข้า ListAPIView ไปยังมุมมองของคุณ มุมมองนี้ช่วยให้คุณแสดงรายการออบเจ็กต์โมเดลได้:
# views.py
from rest_framework.generics import CreateAPIView, ListAPIView
⭐ สร้างคลาสสำหรับมุมมองของคุณและระบุซีเรียลไลเซอร์และชุดแบบสอบถามที่จะใช้:
# List view
class RecipeListView(ListAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
⭐ สร้างมุมมองเพื่ออ่านสูตรเฉพาะ ในการดำเนินการนี้ คุณต้องมี RestoreeAPIView เพื่อเพิ่มลงในรายการนำเข้าของคุณ:
# views.py
from rest_framework.generics import CreateAPIView, ListAPIView, RetrieveAPIView
จากนั้น สร้างมุมมองที่คุณต้องการ:
# Retrieve view
class RecipeRetrieveView(RetrieveAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
ขั้นตอนที่ 6: เขียนมุมมองสำหรับการดำเนินการอัปเดตและลบ
ในการดำเนินการ UPDATE และ DELETE จำเป็นต้องใช้มุมมอง API ที่เกี่ยวข้อง ได้แก่ UpdateAPIView
และ DestroyAPIView
ดังนั้นจึงต้องนำเข้ามุมมองเหล่านี้ตามนั้น
from rest_framework.generics import (
ListAPIView,
CreateAPIView,
RetrieveAPIView,
UpdateAPIView, # new
DestroyAPIView, # new
)
ต่อไป เราจะใช้มุมมองที่จำเป็นซึ่งจะสืบทอดมาจากทั้ง UpdateAPIView
และ DestroyAPIView
ตาม:
# Update view
class RecipeUpdateView(UpdateAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
# Delete view
class RecipeDeleteView(DestroyAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
ขั้นตอนที่ 7: สร้าง URL สำหรับแอปของคุณ
⭐ เพิ่มโค้ดนี้ไปที่ core/urls.py เพื่อกำหนดค่า URL ของคุณ:
from django.urls import path, include
urlpatterns = [
path('api/', include('recipe_manager.urls'))
]
⭐ เพิ่มโค้ดต่อไปนี้ลงในไฟล์ Recipe_manager/urls.py ของคุณ:
from django.urls import path
from . import views
urlpatterns = [
# List view (Read all)
path('recipes/', views.RecipeListView.as_view(), name='recipe-list'),
# Create view
path('recipes/create/', views.RecipeCreateView.as_view(), name='recipe-create'),
# Retrieve view (Read one)
path('recipes/<int:pk>/', views.RecipeRetrieveView.as_view(), name='recipe-retrieve'),
# Update view
path('recipes/<int:pk>/update/', views.RecipeUpdateView.as_view(), name='recipe-update'),
# Delete view
path('recipes/<int:pk>/delete/', views.RecipeDeleteView.as_view(), name='recipe-destroy'),
]
จากโค้ดข้างต้น คุณจะสังเกตเห็นว่ามุมมองแบบคลาสใช้ฟังก์ชัน as_view() เพื่อสร้างรูปแบบ URL คุณยังสามารถอ่านเกี่ยวกับความแตกต่างระหว่างโปรเจ็กต์และแอปใน Django ได้ หากคุณสับสนกับการใช้งานที่นี่
ขั้นตอนที่ 8: ทดสอบจุดสิ้นสุด API ของคุณ
จากไดเร็กทอรีโปรเจ็กต์ของคุณ ให้รันสิ่งต่อไปนี้:
python manage.py runserver
การดำเนินการนี้คาดว่าจะเริ่มต้นเซิร์ฟเวอร์ ดำเนินการตรวจสอบบางอย่าง และสร้างที่อยู่เว็บที่อนุญาตให้เข้าถึงจากระยะไกล
ตอนนี้คุณสามารถตรวจสอบจุดสิ้นสุด API ของคุณได้โดยไปที่ URI ที่เกี่ยวข้อง เช่น “/api/recipes/” และใช้วิธีการร้องขอ HTTP ต่างๆ เพื่อดำเนินการ CRUD คาดว่าคุณจะได้พบกับอินเทอร์เฟซผู้ใช้มาตรฐานที่คล้ายกับที่แสดงด้านล่าง:
อีกทางหนึ่ง แทนที่จะใช้เว็บเบราว์เซอร์ เราอาจเลือกใช้แอปพลิเคชันบุรุษไปรษณีย์เพื่อทดสอบและโต้ตอบกับ API
ฝึกฝน DRY ในขณะที่สร้าง CRUD API
แนะนำให้ใช้หลักการเขียนโปรแกรมที่เรียกว่า"DRY"เพื่อเพิ่มความสามารถโดยรวมของโค้ดของคุณ หลักการนี้ซึ่งย่อมาจาก “Don’t Repeat Yourself” สนับสนุนให้นักพัฒนาหลีกเลี่ยงการทำซ้ำโค้ดและมุ่งมั่นเพื่อประสิทธิภาพโดยการนำส่วนประกอบที่มีอยู่กลับมาใช้ใหม่หรือสร้างส่วนประกอบใหม่เมื่อจำเป็น การทำเช่นนี้ไม่เพียงช่วยประหยัดเวลาเท่านั้น แต่ยังช่วยให้มั่นใจได้ว่าโค้ดของพวกเขายังคงความสอดคล้องและบำรุงรักษาได้ตลอดเวลา
เมื่อพิจารณามุมมองที่กล่าวถึงก่อนหน้านี้ เป็นที่น่าสังเกตว่าการใช้มุมมองทั่วไป ListCreateAPIView และ RestoreeUpdateDestroyAPIView สามารถลดความซ้ำซ้อนในโค้ดของคุณได้อย่างมาก
ListCreateAPIView เป็นการผสมผสานระหว่าง ListAPIView และ CreateAPIView ในขณะที่ RestoreeUpdateDestroyAPIView รวมฟังก์ชันการดึงข้อมูลของ RestoreeAPIView เข้ากับความสามารถในการอัปเดตและการลบที่พบใน UpdateAPIView และ DestroyAPIView ตามลำดับ
เราอาจเปลี่ยนมุมมองก่อนหน้านี้โดยใช้เค้าโครงที่คล้ายกับตัวอย่างต่อไปนี้:
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .models import Recipe
from .serializers import RecipeSerializer
class RecipeListCreateAPIView(ListCreateAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
class RecipeRetrieveUpdateDeleteAPIView(RetrieveUpdateDestroyAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
การใช้วิธีนี้ส่งผลให้โครงสร้างการเข้ารหัสมีความกระชับและคล่องตัวยิ่งขึ้น ซึ่งช่วยลดการสะสมบรรทัดโค้ดที่มากเกินไป
หากต้องการสร้างลิงก์ไปยังมุมมองที่สร้างขึ้นใหม่ คุณอาจทำตามขั้นตอนเหล่านี้:
from django.urls import path
from .views import RecipeListCreateAPIView, RecipeRetrieveUpdateDeleteAPIView
urlpatterns = [
# List and Create view
path('recipes/', RecipeListCreateAPIView.as_view(), name='recipe-list-create'),
# Retrieve, Update, and Delete view
path('recipes/<int:pk>/', RecipeRetrieveUpdateDeleteAPIView.as_view(), name='recipe-retrieve-update-destroy'),
]
คุณสามารถประเมินจุดสิ้นสุดเหล่านี้โดยใช้ที่ต้องการ
มุมมองตามชั้นเรียนทั่วไปทำให้งานของคุณง่ายขึ้น
ข้างต้น แสดงให้เห็นว่าการใช้มุมมองตามคลาสทั่วไปสามารถเร่งขั้นตอนการสร้างมุมมองได้ ในปัจจุบัน สิ่งที่คุณต้องทำก็แค่สืบทอด APIView ที่เหมาะสมตามแอปพลิเคชันเฉพาะของตน
ขอแนะนำให้คุณปฏิบัติตามเทคนิคการเขียนโปรแกรมเสียงเพื่อป้องกันการสร้างโค้ดที่ต่ำกว่ามาตรฐาน