حول المحتوى:
تعرف على الفئات المختلفة التي يقدمها Django REST Framework مثل APIView وViewSets وModelViewSet. استكشف كيفية استخدامها لإنشاء RESTful APIs قوية ومرنة مع أمثلة عملية ونصائح مفيدة.
عالم تطوير واجهات برمجة التطبيقات (APIs) أصبح أكثر أهمية من أي وقت مضى، حيث تعد APIs الجسر الأساسي بين التطبيقات المختلفة. ومع ظهور أدوات متقدمة مثل Django REST Framework (DRF)، أصبح بناء واجهات برمجة قوية ومرنة أسهل وأكثر كفاءة. إذا كنت مطورًا يعمل على إنشاء RESTful APIs باستخدام Django، فإن فهم الفئات المختلفة التي يقدمها DRF، مثل APIView وViewSets، يعتبر خطوة أساسية نحو إنشاء حلول فعالة ومتقنة. في هذا المقال، سنستعرض تفاصيل هذه الفئات، ميزاتها، وأمثلة عملية لاستخدامها، لنساعدك على اختيار الأنسب لمشروعك.
Django REST framework يوفر مجموعة من الـ Generic Views التي تسهّل إنشاء واجهات برمجية API باستخدام أقل قدر من الكود. إليك شرحًا باللغة العربية لكل منها:
POST
.from rest_framework.generics import CreateAPIView
from .models import MyModel
from .serializers import MyModelSerializer
class MyModelCreateView(CreateAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
DELETE
.from rest_framework.generics import DestroyAPIView
from .models import MyModel
class MyModelDestroyView(DestroyAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from .models import MyModel
from .serializers import MyModelSerializer
class MyModelCustomView(GenericAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def get(self, request, *args, **kwargs):
obj = self.get_object()
serializer = self.get_serializer(obj)
return Response(serializer.data)
GET
.from rest_framework.generics import ListAPIView
from .models import MyModel
class MyModelListView(ListAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
GET
و POST
.from rest_framework.generics import ListCreateAPIView
class MyModelListCreateView(ListCreateAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
GET
.from rest_framework.generics import RetrieveAPIView
class MyModelRetrieveView(RetrieveAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
GET
و DELETE
.from rest_framework.generics import RetrieveDestroyAPIView
class MyModelRetrieveDestroyView(RetrieveDestroyAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
GET
و PUT/PATCH
.from rest_framework.generics import RetrieveUpdateAPIView
class MyModelRetrieveUpdateView(RetrieveUpdateAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
GET
، وPUT/PATCH
، وDELETE
.from rest_framework.generics import RetrieveUpdateDestroyAPIView
class MyModelRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
PUT
و PATCH
.from rest_framework.generics import UpdateAPIView
class MyModelUpdateView(UpdateAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
يمكنك اختيار الـ Generic View المناسبة بناءً على الاحتياجات الخاصة بـ API الذي تبنيه.
Django REST Framework توفر mixins وهي مكونات قابلة لإعادة الاستخدام تضيف وظائف محددة لتنفيذ عمليات CRUD. يتم استخدام هذه الميكسينات عادة مع GenericAPIView
لإنشاء عروض (Views) مخصصة تجمع بين سلوكيات معينة. إليك شرحًا للميكسينات التي ذكرتها:
POST
.GenericAPIView
.from rest_framework.mixins import CreateModelMixin
from rest_framework.generics import GenericAPIView
from .models import MyModel
from .serializers import MyModelSerializer
class MyModelCreateView(CreateModelMixin, GenericAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
DELETE
.GenericAPIView
.from rest_framework.mixins import DestroyModelMixin
class MyModelDestroyView(DestroyModelMixin, GenericAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
GET
.GenericAPIView
.from rest_framework.mixins import ListModelMixin
class MyModelListView(ListModelMixin, GenericAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
GET
.GenericAPIView
.from rest_framework.mixins import RetrieveModelMixin
class MyModelRetrieveView(RetrieveModelMixin, GenericAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
PUT
أو PATCH
.GenericAPIView
.from rest_framework.mixins import UpdateModelMixin
class MyModelUpdateView(UpdateModelMixin, GenericAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
يمكنك دمج عدة ميكسينات لإنشاء عرض مخصص يجمع بين أكثر من وظيفة.
from rest_framework.mixins import (
CreateModelMixin,
ListModelMixin,
RetrieveModelMixin,
UpdateModelMixin,
DestroyModelMixin,
)
from rest_framework.generics import GenericAPIView
class MyModelCustomView(
CreateModelMixin,
ListModelMixin,
RetrieveModelMixin,
UpdateModelMixin,
DestroyModelMixin,
GenericAPIView,
):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def get(self, request, *args, **kwargs):
if 'pk' in kwargs:
return self.retrieve(request, *args, **kwargs)
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
RetrieveUpdateDestroyAPIView
لأنها أكثر اختصارًا وأسهل استخدامًا.تُعد التقسيم (Pagination) في Django REST Framework وسيلة مهمة للتحكم في عدد السجلات التي يتم إرجاعها في استجابات API، مما يساعد على إدارة مجموعات البيانات الكبيرة بسهولة. فيما يلي شرح لأنواع التقسيم الأساسية:
paginate_queryset()
وget_paginated_response()
يدويًا.from rest_framework.pagination import BasePagination
from rest_framework.response import Response
class CustomPagination(BasePagination):
def paginate_queryset(self, queryset, request, view=None):
page_size = 10
page = int(request.query_params.get('page', 1))
start = (page - 1) * page_size
end = start + page_size
self.page = queryset[start:end]
return self.page
def get_paginated_response(self, data):
return Response({
'count': len(self.page),
'results': data
})
created_at
).next
وprevious
للانتقال بين الصفحات.cursor_query_param
: اسم معلمة الطلب للمؤشر (الافتراضي: cursor
).ordering
: الحقل الافتراضي للترتيب (مثل -created_at
).from rest_framework.pagination import CursorPagination
class MyCursorPagination(CursorPagination):
page_size = 5
ordering = '-created_at' # يجب أن يحتوي النموذج على هذا الحقل.
limit
) وموقع البدء (offset
).limit
(الافتراضي: 10)، offset
(الافتراضي: 0).default_limit
: عدد السجلات الافتراضي لكل صفحة.max_limit
: الحد الأقصى لعدد السجلات التي يمكن طلبها.from rest_framework.pagination import LimitOffsetPagination
class MyLimitOffsetPagination(LimitOffsetPagination):
default_limit = 5
max_limit = 100
page
(الافتراضي: 1).page_size
(عدد السجلات لكل صفحة).page_size
: عدد السجلات لكل صفحة.page_query_param
: معلمة الطلب للصفحة (الافتراضي: page
).page_size_query_param
: تتيح للعميل تحديد حجم الصفحة.max_page_size
: تحدد الحد الأقصى لحجم الصفحة.from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 5
page_size_query_param = 'page_size'
max_page_size = 100
لتطبيق التقسيم على مستوى المشروع بالكامل، يمكن ضبطه في ملف settings.py
:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10, # حجم الصفحة الافتراضي
}
يوفر Django REST Framework (DRF) فئات مختلفة من الـ Serializers لتحويل أنواع البيانات المعقدة (مثل نماذج Django) إلى أنواع بيانات بايثون الأصلية والعكس صحيح. إليك شرحًا لأنواع الـ Serializers التي ذكرتها:
from rest_framework.serializers import BaseSerializer
class CustomSerializer(BaseSerializer):
def to_representation(self, instance):
# تحويل الكائن إلى قاموس
return {
'id': instance.id,
'name': instance.name,
'description': instance.description,
}
def to_internal_value(self, data):
# تحويل البيانات المدخلة إلى كائن أو قاموس مُتحقق منه
return {
'name': data.get('name'),
'description': data.get('description'),
}
ModelSerializer
.url
تلقائيًا.HyperlinkedIdentityField
للعلاقات.from rest_framework.serializers import HyperlinkedModelSerializer
from .models import MyModel
class MyModelHyperlinkedSerializer(HyperlinkedModelSerializer):
class Meta:
model = MyModel
fields = ['url', 'id', 'name', 'description']
many=True
في Serializers.from rest_framework.serializers import ListSerializer, Serializer
class MyObjectSerializer(Serializer):
name = serializers.CharField()
class MyListSerializer(ListSerializer):
def update(self, instance, validated_data):
# منطق مخصص لتحديث كائنات متعددة
pass
class CustomListSerializer(Serializer):
child = MyObjectSerializer(many=True, list_serializer_class=MyListSerializer)
from rest_framework.serializers import ModelSerializer
from .models import MyModel
class MyModelSerializer(ModelSerializer):
class Meta:
model = MyModel
fields = '__all__' # تضمين جميع الحقول في النموذج
ModelSerializer
.create
وupdate
.from rest_framework import serializers
class MyCustomSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(max_length=100)
description = serializers.CharField()
def create(self, validated_data):
# إنشاء كائن جديد وإرجاعه
return MyModel.objects.create(**validated_data)
def update(self, instance, validated_data):
# تحديث كائن موجود وإرجاعه
instance.name = validated_data.get('name', instance.name)
instance.description = validated_data.get('description', instance.description)
instance.save()
return instance
Serializer | الاستخدام |
---|---|
BaseSerializer | عند الحاجة إلى التحكم الكامل في عملية التحويل. |
HyperlinkedModelSerializer | لواجهات API التي تستخدم روابط لتمثيل العلاقات. |
ListSerializer | للتعامل مع قوائم الكائنات مع متطلبات مخصصة. |
ModelSerializer | لتبسيط عمليات التحويل للبيانات المعتمدة على نماذج Django. |
Serializer | للاستخدامات العامة أو البيانات غير المرتبطة بالنماذج أو عندما تحتاج إلى منطق مخصص. |
سواء كنت تطور واجهات برمجة بيانات بسيطة أو أنظمة API معقدة، فإن Django REST Framework يوفر الأدوات اللازمة لتلبية احتياجاتك. من خلال APIView للمرونة الكاملة، أو ModelViewSet لإنشاء APIs قياسية بسهولة، يمكنك اختيار الفئة المناسبة لكل حالة. إن فهم هذه الفئات واستخدامها بشكل صحيح يساعدك على تحسين كفاءة التطوير وضمان جودة الخدمة التي تقدمها. الآن، حان الوقت لتطبيق هذه المعرفة في مشاريعك القادمة وتحقيق أقصى استفادة من DRF!
تعرف على الفئات المختلفة التي يقدمها Django REST Framework مثل APIView وViewSets وModelViewSet. استكشف كيفية استخدامها لإنشاء RESTful APIs قوية ومرنة مع أمثلة عملية ونصائح مفيدة.
مساحة اعلانية
numpy, requests, re