وقتی وارد دنیای DRF میشید با روش های مختلفی برای نوشتن ویو ها روبرو میشید که ممکنه گیج کننده باشه. توی این مقاله میخایم انواع ویو ها در DRF رو بشناسیم و یاد  بگیریم کی و کجا باید از کدوم استفاده کنیم.

چرا تنوع view ها در DRF زیاد است؟

فریمورک DRF بر اساس فلسفه ی انعطاف پذیری ساخته شده. گاهی اوقات شما نیاز دارید تمام جزییات رو خودتون کنترل کنید. و گاهی اوقات فقط میخواید چهار عمل اصلی (CRUD) رو روی دیتابیس انجام بدید و  دوست ندارید کد تکراری بزنید، DRF ویو ها را به ۴ دسته اصلی تقسیم کرده :

۱.Function Based View

2.APIView (Class Based)

3.Generic Views & Mixins

4.ViewSets

۱.Function Based Views

این روش پایه ترین و ساده ترین شیوه نوشتن API هست. دقیقا مثل ویو های جنگو شما یک تابع پایتونی می نویسید اما با استفاده از یک دکوریتور به اسم @api_view 

ویژگی اصلی: صراحت و سادگی

چطور کار میکنه؟ شما تابعی می‌نویسید و مشخص میکنید که به متد های GET یا POST پاسخ بده.

@api_view(['GET', 'POST'])
def article_list(request):
    if request.method == 'GET':
        # منطق دریافت لیست
        return Response(...)
    elif request.method == 'POST':
        # منطق ساختن آیتم جدید
        return Response(...)

۲. کلاس ‌های پایه: APIView

اگه طرفدار برنامه نویسی شی گرا هستید و میخواید کد هاتون مرتب تر باشه، APIView انتخاب خوبی هست. اینجا به جای شرط ‌های if، متد های کلاس مثل .get() و .post() رو تعریف میکنید.

ویژگی اصلی: ساختار کلاس‌ محور با حفظ کنترل کامل.

چرا استفاده کنیم؟ APIView هسته اصلی تمام ویو های پیشرفته ‌تر DRF هست. وقتی نیاز دارید از قدرت کلاس‌ ها استفاده کنید اما هنوز هم میخواید منطق بیزنس رو خودتون کامل بنویسید، این بهترین گزینست.

۳.Generic Views

اینجا جاییه که جادوی DRF شروع میشه! در خیلی از پروژه‌ ها، ما کار های تکراری انجام میدیم: «یک لیست بگیر»، «یک آیتم بساز»، «یک آیتم رو آپدیت کن». چرا باید هربار کدش رو بنویسیم؟ Generic Views کلاس ‌هایی هستند که این منطق‌های تکراری رو از قبل آماده کردن.

چطور کار میکنه؟ شما فقط QuerySet (داده‌ها) و Serializer (قالب داده) رو مشخص میکنید. بقیه کارها رو DRF انجام میده.

انواع پرکاربرد:

ListAPIView: برای نمایش لیست.

CreateAPIView: برای ساختن.

RetrieveUpdateDestroyAPIView: پکیج کامل برای ویرایش و حذف یک آیتم.

۴. ViewSets

اگر میخواید با کمترین میزان کد نویسی، یک API کامل استاندارد داشته باشید، ViewSetها برای شما ساخته شدن. ویو ست‌ ها به جای متدهای HTTP (مثل Get/Post)، روی «عملکرد ها» تمرکز دارن (مثل List, Create, Retrieve).

  • ویژگی اصلی: ترکیب با Routerها. در ویو ست ‌ها شما دیگه نیازی نیست توی فایل urls.py تک  تک مسیر ها رو تعریف کنید. خود Router مسیر ها رو اتوماتیک میسازه.

  • ModelViewSet: این کلاس، تمام عملیات CRUD (خواندن، نوشتن، آپدیت، حذف) رو در ۵ خط کد به شما میده!

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
# تمام! API شما آماده است.

مقایسه و انتخاب

مقایسه ViewSet با APIView:

ViewSet: وقتی دارید یک API استاندارد برای دیتابیس میسازید (مثلاً مدیریت کاربران یا محصولات) و سرعت توسعه براتون مهمه، قطعاً ViewSet برنده است.

APIView: وقتی سرویس شما کار خاصی میکنه (مثلاً فراخوانی یک API بانکی، ارسال ایمیل خاص، یا پردازش تصویر) و مستقیماً با CRUD دیتابیس درگیر نیست، APIView کنترل بهتری به شما میده.

مقایسه Generic Views با Function Based:

اگر ویوی شما فقط قراره «یک لیست نمایش بده»، نوشتن یک تابع (FBV) و هندل کردن صفحه‌ بندی و فیلتر ها به صورت دستی، اختراع دوباره‌ ی چرخ هست. اینجا Genericsها با دو خط کد کار رو تموم میکنن.

اما اگر قراره لیست شما بر اساس پارامتر های خیلی پیچیده و محاسبات سنگین ریاضی تولید بشه، شاید FBV راحت‌تر باشه.

جمع بندی

اکوسیستم Django Rest Framework ابزار های متنوعی رو در اختیار توسعه دهنده قرار میده تا روی سرعت توسعه و کنترل کد تعادل ایجاد کنه.

اگر میخواید سریع یک پروژه استاندارد رو بالا بیارید: ViewSets.

اگر نیاز به اندپوینت‌ های خاص (مثل فقط خواندن) دارید: Generics.

اگر منطق پیچیده و کاستوم دارید: APIView.

در نهایت هیچ بهترینی وجود نداره، بهترین ویو، ویویی هست که نیاز پروژه شما رو با کمترین پیچیدگی و تمیز ترین کد برطرف کنه.