जानें कि ViewSets का उपयोग करके अपने Django REST Framework APIs को प्रभावी ढंग से कैसे व्यवस्थित करें। यह मार्गदर्शिका बुनियादी उपयोग से लेकर उन्नत अनुकूलन तक सब कुछ शामिल करती है, व्यावहारिक उदाहरण और सर्वोत्तम प्रथाएं प्रदान करती है।
Django REST Framework ViewSets: API एंडपॉइंट संगठन में महारत हासिल करना
आधुनिक वेब विकास में, मजबूत और अच्छी तरह से संरचित APIs बनाना महत्वपूर्ण है। Django REST Framework (DRF) Django के साथ RESTful APIs बनाने के लिए एक शक्तिशाली टूलकिट है। जबकि DRF API एंडपॉइंट बनाने के लिए विभिन्न उपकरण प्रदान करता है, ViewSets संबंधित विचारों को एक ही वर्ग में व्यवस्थित करने का एक सुरुचिपूर्ण तरीका प्रदान करते हैं, जिसके परिणामस्वरूप साफ-सुथरा और अधिक रखरखाव योग्य कोड होता है। यह व्यापक मार्गदर्शिका ViewSets की विस्तार से जांच करेगी, उनके लाभों, उपयोग और उन्नत अनुकूलन तकनीकों को शामिल करेगी।
ViewSets क्या हैं?
एक ViewSet एक वर्ग-आधारित दृश्य है जो मानक संचालन के लिए कार्यान्वयन प्रदान करता है, जैसे कि list
, create
, retrieve
, update
, और destroy
। प्रत्येक ऑपरेशन के लिए अलग-अलग दृश्य परिभाषित करने के बजाय, एक ViewSet उन्हें एक ही वर्ग में जोड़ता है, API संरचना को सरल करता है और कोड डुप्लीकेशन को कम करता है। ViewSets मॉडल-आधारित APIs के साथ काम करते समय विशेष रूप से उपयोगी होते हैं, जहाँ इन मानक ऑपरेशनों की आमतौर पर आवश्यकता होती है। एक ViewSet को एक विशिष्ट संसाधन पर संचालन के तार्किक समूहन के रूप में सोचें।
ViewSets का उपयोग करने के लाभ
- कोड पुन: प्रयोज्यता: ViewSets एक ही वर्ग में सामान्य API तर्क को शामिल करके कोड पुन: उपयोग को बढ़ावा देते हैं। यह अतिरेक को कम करता है और कोड को बनाए रखना आसान बनाता है।
- सरलीकृत रूटिंग: ViewSets एक ही URL उपसर्ग के तहत संबंधित विचारों को समूहित करके रूटिंग को सरल करते हैं। इसके परिणामस्वरूप एक साफ-सुथरी और अधिक व्यवस्थित URL संरचना होती है।
- कम बॉयलरप्लेट: ViewSets सामान्य API ऑपरेशनों के लिए डिफ़ॉल्ट कार्यान्वयन प्रदान करके बॉयलरप्लेट कोड को कम करते हैं। यह डेवलपर्स को उनके एप्लिकेशन के लिए विशिष्ट कस्टम तर्क को लागू करने पर ध्यान केंद्रित करने की अनुमति देता है।
- बेहतर पठनीयता: ViewSets संबंधित विचारों को एक ही वर्ग में व्यवस्थित करके कोड पठनीयता में सुधार करते हैं। यह API संरचना को समझने और नेविगेट करने में आसान बनाता है।
- संगति: ViewSets संचालन और सम्मेलनों के एक मानक सेट को लागू करके API में निरंतरता सुनिश्चित करने में मदद करते हैं। यह API को अधिक अनुमानित और उपयोग में आसान बनाता है।
ViewSets का बुनियादी उपयोग
आइए उत्पादों के प्रबंधन के लिए एक API बनाने के लिए ViewSets का उपयोग करने के एक सरल उदाहरण से शुरू करें। सबसे पहले, एक मॉडल परिभाषित करें:
# models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
price = models.DecimalField(max_digits=10, decimal_places=2)
def __str__(self):
return self.name
इसके बाद, Product
मॉडल के लिए एक सीरियलाइज़र परिभाषित करें:
# serializers.py
from rest_framework import serializers
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
अब, Product
मॉडल के लिए एक ViewSet बनाएँ:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
अंत में, URL रूटिंग कॉन्फ़िगर करें:
# urls.py
from django.urls import path, include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'products', views.ProductViewSet)
urlpatterns = [
path('', include(router.urls)),
]
यह कॉन्फ़िगरेशन स्वचालित रूप से निम्नलिखित API एंडपॉइंट उत्पन्न करेगा:
/products/
(GET: list, POST: create)/products/{id}/
(GET: retrieve, PUT: update, PATCH: partial_update, DELETE: destroy)
ModelViewSet
सभी मानक CRUD ऑपरेशनों के लिए डिफ़ॉल्ट कार्यान्वयन प्रदान करता है। queryset
विशेषता उन वस्तुओं के समूह को निर्दिष्ट करती है जिन पर ViewSet को संचालित करना चाहिए, और serializer_class
विशेषता उस सीरियलाइज़र को निर्दिष्ट करती है जिसका उपयोग डेटा को सीरियल करने और डीसीरियल करने के लिए किया जाना चाहिए।
ViewSets के प्रकार
DRF विभिन्न उपयोग मामलों को पूरा करने वाले कई बिल्ट-इन ViewSet क्लास प्रदान करता है:
ViewSet
: सभी ViewSets के लिए बेस क्लास। यह अनुरोधों और प्रतिक्रियाओं को संभालने के लिए बुनियादी बुनियादी ढांचा प्रदान करता है।ReadOnlyModelViewSet
: एक ViewSet जो केवल-पढ़ने योग्य संचालन (list
औरretrieve
) प्रदान करता है। यह उन APIs के लिए उपयोगी है जो केवल डेटा पुनर्प्राप्ति की अनुमति देते हैं।ModelViewSet
: एक ViewSet जो सभी मानक CRUD ऑपरेशन (list
,create
,retrieve
,update
, औरdestroy
) प्रदान करता है। यह मॉडल-आधारित APIs के लिए सबसे अधिक उपयोग किया जाने वाला ViewSet है।GenericViewSet
: एक ViewSet जो सामान्य API ऑपरेशनों के लिए एक सामान्य कार्यान्वयन प्रदान करता है। इसका उपयोग कस्टम ViewSets बनाने के लिए एक बेस क्लास के रूप में किया जा सकता है।
सही ViewSet का चुनाव आपके API की विशिष्ट आवश्यकताओं पर निर्भर करता है। यदि आपको केवल-पढ़ने योग्य ऑपरेशनों की आवश्यकता है, तो ReadOnlyModelViewSet
का उपयोग करें। यदि आपको सभी मानक CRUD ऑपरेशनों की आवश्यकता है, तो ModelViewSet
का उपयोग करें। यदि आपको API व्यवहार पर अधिक नियंत्रण की आवश्यकता है, तो आप GenericViewSet
या ViewSet
से इनहेरिट करके एक कस्टम ViewSet बना सकते हैं।
ViewSets को अनुकूलित करना
जबकि बिल्ट-इन ViewSets APIs बनाने का एक सुविधाजनक तरीका प्रदान करते हैं, आपको विशिष्ट आवश्यकताओं को पूरा करने के लिए उनके व्यवहार को अनुकूलित करने की आवश्यकता हो सकती है। DRF ViewSets को अनुकूलित करने के कई तरीके प्रदान करता है, जिसमें विधियों को ओवरराइड करना, कस्टम क्रियाएं जोड़ना और कस्टम सीरियलाइज़र का उपयोग करना शामिल है।
विधियों को ओवरराइड करना
आप अपनी ViewSet क्लास में समान नामों वाली विधियों को परिभाषित करके मानक API ऑपरेशनों के डिफ़ॉल्ट कार्यान्वयन को ओवरराइड कर सकते हैं। उदाहरण के लिए, आप एक नई वस्तु बनाने से पहले या बाद में कस्टम तर्क जोड़ने के लिए create
विधि को ओवरराइड कर सकते हैं:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework.response import Response
from rest_framework import status
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
# Add custom logic here before creating the object
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
इस उदाहरण में, create
विधि डिफ़ॉल्ट कार्यान्वयन को ओवरराइड करती है और ऑब्जेक्ट बनाने से पहले कस्टम तर्क जोड़ती है। ऑब्जेक्ट को वास्तव में बनाने के लिए perform_create
विधि को बुलाया जाता है, और प्रतिक्रिया 201 Created
स्थिति कोड के साथ वापस आ जाती है।
कस्टम क्रियाएँ जोड़ना
आप @action
डेकोरेटर का उपयोग करके अपने ViewSet में कस्टम क्रियाएँ जोड़ सकते हैं। कस्टम क्रियाएं आपको नए API एंडपॉइंट को परिभाषित करने की अनुमति देती हैं जो ViewSet द्वारा प्रबंधित संसाधनों पर विशिष्ट ऑपरेशन करते हैं। उदाहरण के लिए, आप एक उत्पाद को फ़ीचर्ड के रूप में चिह्नित करने के लिए एक क्रिया जोड़ सकते हैं:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
@action(detail=True, methods=['post'])
def feature(self, request, pk=None):
product = self.get_object()
product.is_featured = True
product.save()
serializer = self.get_serializer(product)
return Response(serializer.data)
इस उदाहरण में, @action
डेकोरेटर एक नया API एंडपॉइंट /products/{id}/feature/
को परिभाषित करता है जो एक उत्पाद को फ़ीचर्ड के रूप में चिह्नित करता है। detail=True
तर्क इंगित करता है कि क्रिया मॉडल के एक विशिष्ट उदाहरण पर संचालित होती है। methods=['post']
तर्क निर्दिष्ट करता है कि क्रिया केवल POST अनुरोध स्वीकार करती है।
कस्टम सीरियलाइज़र का उपयोग करना
आप ViewSet द्वारा डेटा को सीरियल और डीसीरियल किए जाने के तरीके को अनुकूलित करने के लिए कस्टम सीरियलाइज़र का उपयोग कर सकते हैं। यह तब उपयोगी होता है जब आपको जटिल डेटा संरचनाओं को संभालने या कस्टम सत्यापन करने की आवश्यकता होती है। उदाहरण के लिए, आप API प्रतिक्रिया में संबंधित डेटा शामिल करने के लिए एक कस्टम सीरियलाइज़र का उपयोग कर सकते हैं:
# serializers.py
from rest_framework import serializers
from .models import Product, Category
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['id', 'name']
class ProductSerializer(serializers.ModelSerializer):
category = CategorySerializer(read_only=True)
class Meta:
model = Product
fields = '__all__'
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
इस उदाहरण में, ProductSerializer
संबंधित श्रेणी डेटा को सीरियल करने के लिए एक CategorySerializer
शामिल करता है। यह आपको एक ही API अनुरोध में उत्पाद जानकारी के साथ श्रेणी जानकारी प्राप्त करने की अनुमति देता है।
उन्नत ViewSet तकनीकें
बुनियादी उपयोग और अनुकूलन से परे, ViewSets परिष्कृत APIs बनाने के लिए उन्नत तकनीकें प्रदान करते हैं:
फ़िल्टरिंग
DRF शक्तिशाली फ़िल्टरिंग क्षमताएं प्रदान करता है जो आपको अनुरोध पैरामीटर के आधार पर क्वेरीसेट को फ़िल्टर करने की अनुमति देती हैं। आप उपयोग करने के लिए फ़िल्टरिंग बैकएंड को निर्दिष्ट करने के लिए filter_backends
विशेषता का उपयोग कर सकते हैं। उदाहरण के लिए, आप उपयोगकर्ताओं को नाम या विवरण द्वारा उत्पादों की खोज करने की अनुमति देने के लिए SearchFilter
का उपयोग कर सकते हैं:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework import filters
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = [filters.SearchFilter]
search_fields = ['name', 'description']
इस उदाहरण में, filter_backends
विशेषता निर्दिष्ट करती है कि SearchFilter
का उपयोग किया जाना चाहिए। search_fields
विशेषता उन फ़ील्ड को निर्दिष्ट करती है जिनकी खोज की जानी चाहिए।
पेजिनेशन
DRF पेजिनेशन क्षमताएं प्रदान करता है जो आपको क्वेरीसेट को छोटे पृष्ठों में विभाजित करने की अनुमति देती हैं। यह बड़े डेटासेट से निपटने में उपयोगी है। आप उपयोग करने के लिए पेजिनेशन क्लास को निर्दिष्ट करने के लिए pagination_class
विशेषता का उपयोग कर सकते हैं। उदाहरण के लिए, आप पृष्ठ संख्याओं का उपयोग करके परिणामों को पेज करने के लिए PageNumberPagination
का उपयोग कर सकते हैं:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework.pagination import PageNumberPagination
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
pagination_class = PageNumberPagination
इस उदाहरण में, pagination_class
विशेषता निर्दिष्ट करती है कि PageNumberPagination
का उपयोग किया जाना चाहिए। आप अपनी स्वयं की पेजिनेशन क्लास बनाकर पेजिनेशन व्यवहार को भी अनुकूलित कर सकते हैं।
प्रमाणीकरण और अनुमतियाँ
DRF लचीले प्रमाणीकरण और अनुमति तंत्र प्रदान करता है जो आपको अपने API एंडपॉइंट तक पहुंच को नियंत्रित करने की अनुमति देते हैं। आप उपयोग करने के लिए प्रमाणीकरण और अनुमति कक्षाओं को निर्दिष्ट करने के लिए authentication_classes
और permission_classes
विशेषताओं का उपयोग कर सकते हैं। उदाहरण के लिए, आप टोकन का उपयोग करके उपयोगकर्ताओं को प्रमाणित करने के लिए TokenAuthentication
का उपयोग कर सकते हैं और केवल प्रमाणित उपयोगकर्ताओं को API तक पहुंचने की अनुमति देने के लिए IsAuthenticated
अनुमति का उपयोग कर सकते हैं:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
इस उदाहरण में, authentication_classes
विशेषता निर्दिष्ट करती है कि TokenAuthentication
का उपयोग किया जाना चाहिए, और permission_classes
विशेषता निर्दिष्ट करती है कि IsAuthenticated
अनुमति का उपयोग किया जाना चाहिए।
ViewSets का उपयोग करने के लिए सर्वोत्तम प्रथाएँ
यह सुनिश्चित करने के लिए कि आपके ViewSets अच्छी तरह से डिज़ाइन किए गए हैं और रखरखाव योग्य हैं, इन सर्वोत्तम प्रथाओं का पालन करें:
- ViewSets को केंद्रित रखें: प्रत्येक ViewSet एक ही संसाधन या संसाधनों के निकट से संबंधित समूह का प्रबंधन करने के लिए जिम्मेदार होना चाहिए। अत्यधिक जटिल ViewSets बनाने से बचें जो कई असंबंधित संचालन को संभालते हैं।
- उचित ViewSet प्रकारों का उपयोग करें: ViewSet प्रकार चुनें जो आपके API की आवश्यकताओं के लिए सबसे उपयुक्त हो। केवल-पढ़ने योग्य APIs के लिए
ReadOnlyModelViewSet
का उपयोग करें, CRUD APIs के लिएModelViewSet
का उपयोग करें, और कस्टम APIs के लिएGenericViewSet
याViewSet
का उपयोग करें। - RESTful सिद्धांतों का पालन करें: RESTful सिद्धांतों के अनुसार अपने API एंडपॉइंट डिज़ाइन करें। संसाधनों पर संचालन करने के लिए मानक HTTP विधियों (GET, POST, PUT, PATCH, DELETE) का उपयोग करें।
- डेटा सत्यापन के लिए सीरियलाइज़र का उपयोग करें: API से भेजे और प्राप्त किए जाने वाले डेटा को मान्य करने के लिए सीरियलाइज़र का उपयोग करें। यह डेटा अखंडता सुनिश्चित करने और त्रुटियों को रोकने में मदद करता है।
- उचित प्रमाणीकरण और अनुमतियाँ लागू करें: उचित प्रमाणीकरण और अनुमतियाँ लागू करके अपने API एंडपॉइंट को सुरक्षित करें। यह आपके डेटा को अनधिकृत पहुंच से बचाने में मदद करता है।
- व्यापक परीक्षण लिखें: यह सुनिश्चित करने के लिए कि आपके ViewSets सही ढंग से काम कर रहे हैं, व्यापक परीक्षण लिखें। यह प्रतिगमन को रोकने और कोड को बनाए रखना आसान बनाने में मदद करता है।
अंतर्राष्ट्रीयकरण (i18n) और स्थानीयकरण (l10n) विचार
वैश्विक दर्शकों के लिए APIs बनाते समय, अंतर्राष्ट्रीयकरण (i18n) और स्थानीयकरण (l10n) पर विचार करना आवश्यक है। ViewSets को कई भाषाओं और क्षेत्रों का समर्थन करने के लिए अनुकूलित किया जा सकता है:
- सीरियलाइज़र फ़ील्ड: अनुवादित फ़ील्ड लेबल और सहायता पाठ प्रदर्शित करने के लिए उचित अनुवाद कार्यों (उदाहरण के लिए, Django के i18n फ्रेमवर्क से
gettext
) के साथ DRF के सीरियलाइज़र फ़ील्ड का उपयोग करें। - त्रुटि संदेश: सुनिश्चित करें कि API द्वारा लौटाए गए त्रुटि संदेश उपयोगकर्ता की पसंदीदा भाषा में अनुवादित हैं।
- दिनांक और समय स्वरूपण: उपयोगकर्ता के स्थानीय के आधार पर उचित दिनांक और समय स्वरूपण का उपयोग करें। DRF दिनांक और समय प्रारूपों को अनुकूलित करने के विकल्प प्रदान करता है।
- मुद्रा स्वरूपण: उपयोगकर्ता के स्थानीय के अनुसार मुद्रा मान स्वरूपित करें। मुद्रा स्वरूपण के लिए
babel
जैसे पुस्तकालयों का उपयोग करने पर विचार करें। उदाहरण के लिए, USD में 1234.56 की कीमत को US में $1,234.56 के रूप में स्वरूपित किया जा सकता है, लेकिन कुछ यूरोपीय देशों में 1.234,56 $ के रूप में। - समय क्षेत्र: समय क्षेत्रों को सही ढंग से संभालें। UTC में दिनांक और समय संग्रहीत करें और उन्हें प्रदर्शित करते समय उपयोगकर्ता के स्थानीय समय क्षेत्र में परिवर्तित करें।
उदाहरण के लिए, एक उत्पाद में एक विवरण हो सकता है जिसका अनुवाद करने की आवश्यकता है। आप सीरियलाइज़र के भीतर Django की अनुवाद प्रणाली का उपयोग करेंगे:
# serializers.py
from rest_framework import serializers
from django.utils.translation import gettext_lazy as _
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
description = serializers.CharField(help_text=_("Product description"))
class Meta:
model = Product
fields = '__all__'
और अपने टेम्पलेट या कोड में जो इस सीरियलाइज़र का उपयोग करता है, यह सुनिश्चित करें कि उचित भाषा सक्रिय है।
उदाहरण: अंतर्राष्ट्रीय समर्थन के साथ ई-कॉमर्स API
एक ई-कॉमर्स API की कल्पना करें जो विश्व स्तर पर उत्पाद बेचता है। Product
मॉडल में name
, description
, price
और image
जैसे फ़ील्ड शामिल हो सकते हैं। API को कई भाषाओं और मुद्राओं का समर्थन करने की आवश्यकता है।
ViewSet उत्पादों के लिए बुनियादी CRUD संचालन को संभालेगा। सीरियलाइज़र को उत्पाद के नाम और विवरण के अनुवाद का समर्थन करने के लिए अनुकूलित किया जाएगा। API में श्रेणी के अनुसार उत्पादों को पुनर्प्राप्त करने, मूल्य सीमा के अनुसार उत्पादों को फ़िल्टर करने और कीवर्ड द्वारा उत्पादों की खोज करने के लिए एंडपॉइंट भी शामिल होंगे। इन सुविधाओं को अंतर्राष्ट्रीयकरण पर विचार करने की आवश्यकता होगी, विशेष रूप से खोज शब्दों और उत्पाद विवरण के आसपास जो भाषाओं के बीच भिन्न हो सकते हैं।
उदाहरण URLS:
/en/products/
- अंग्रेजी में उत्पादों की सूची/fr/products/
- फ्रेंच में उत्पादों की सूची/en/products/?currency=USD
- USD में उत्पादों की सूची/fr/products/123/?currency=EUR
- फ्रेंच में उत्पाद 123 का विवरण, EUR में प्रदर्शित मूल्य
निष्कर्ष
Django REST Framework ViewSets आपके API एंडपॉइंट को व्यवस्थित करने का एक शक्तिशाली और सुरुचिपूर्ण तरीका प्रदान करते हैं। संबंधित विचारों को एक ही वर्ग में शामिल करके, ViewSets कोड पुन: उपयोग को बढ़ावा देते हैं, रूटिंग को सरल बनाते हैं और कोड पठनीयता में सुधार करते हैं। विधियों को ओवरराइड करके, कस्टम क्रियाएं जोड़कर और कस्टम सीरियलाइज़र का उपयोग करके ViewSets को अनुकूलित करने की क्षमता के साथ, आप उन्हें अपने API की विशिष्ट आवश्यकताओं को पूरा करने के लिए तैयार कर सकते हैं। इस मार्गदर्शिका में उल्लिखित सर्वोत्तम प्रथाओं का पालन करके, आप यह सुनिश्चित कर सकते हैं कि आपके ViewSets अच्छी तरह से डिज़ाइन किए गए, रखरखाव योग्य और स्केलेबल हैं, जिसके परिणामस्वरूप मजबूत और कुशल APIs बनते हैं।
वैश्विक दर्शकों के लिए APIs बनाते समय अंतर्राष्ट्रीयकरण और स्थानीयकरण पर विचार करना याद रखें। कई भाषाओं, मुद्राओं और समय क्षेत्रों का समर्थन करने के लिए अपने ViewSets और सीरियलाइज़र को अनुकूलित करें ताकि दुनिया भर के उपयोगकर्ताओं के लिए एक सहज अनुभव मिल सके।
ViewSets में महारत हासिल करके, आप अपने Django REST Framework कौशल को अगले स्तर पर ले जा सकते हैं और ऐसे APIs बना सकते हैं जो शक्तिशाली और रखरखाव योग्य दोनों हों। यह उच्च-गुणवत्ता वाले सॉफ़्टवेयर और आपके वैश्विक दर्शकों के लिए एक सकारात्मक उपयोगकर्ता अनुभव में योगदान देता है।
यह मार्गदर्शिका आपके Django REST Framework प्रोजेक्ट्स में ViewSets को समझने और लागू करने के लिए एक ठोस नींव के रूप में काम करनी चाहिए। अभ्यास करते रहें, प्रयोग करते रहें और DRF प्रलेखन का पता लगाते रहें ताकि आप एक सच्चे ViewSet मास्टर बन सकें!