Contents

สร้าง 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 คาดว่าคุณจะได้พบกับอินเทอร์เฟซผู้ใช้มาตรฐานที่คล้ายกับที่แสดงด้านล่าง:

/th/images/django-s-default-api-testing-interface.jpg

อีกทางหนึ่ง แทนที่จะใช้เว็บเบราว์เซอร์ เราอาจเลือกใช้แอปพลิเคชันบุรุษไปรษณีย์เพื่อทดสอบและโต้ตอบกับ 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 ที่เหมาะสมตามแอปพลิเคชันเฉพาะของตน

ขอแนะนำให้คุณปฏิบัติตามเทคนิคการเขียนโปรแกรมเสียงเพื่อป้องกันการสร้างโค้ดที่ต่ำกว่ามาตรฐาน