मैं दो अलग-अलग धारावाहिक प्रदान करना चाहूंगा और फिर भी सभी सुविधाओं का लाभ उठा सकता हूं ModelViewSet
:
- वस्तुओं की सूची को देखते समय, मैं चाहूंगा कि प्रत्येक वस्तु एक url हो जो उसके विवरण को पुनर्निर्देशित करे और हर दूसरा संबंध
__unicode __
लक्ष्य मॉडल का उपयोग करते हुए दिखाई दे ;
उदाहरण:
{
"url": "http://127.0.0.1:8000/database/gruppi/2/",
"nome": "universitari",
"descrizione": "unitn!",
"creatore": "emilio",
"accesso": "CHI",
"membri": [
"emilio",
"michele",
"luisa",
"ivan",
"saverio"
]
}
- किसी वस्तु का विवरण देखने के बाद, मैं डिफ़ॉल्ट का उपयोग करना चाहूंगा
HyperlinkedModelSerializer
उदाहरण:
{
"url": "http://127.0.0.1:8000/database/gruppi/2/",
"nome": "universitari",
"descrizione": "unitn!",
"creatore": "http://127.0.0.1:8000/database/utenti/3/",
"accesso": "CHI",
"membri": [
"http://127.0.0.1:8000/database/utenti/3/",
"http://127.0.0.1:8000/database/utenti/4/",
"http://127.0.0.1:8000/database/utenti/5/",
"http://127.0.0.1:8000/database/utenti/6/",
"http://127.0.0.1:8000/database/utenti/7/"
]
}
मैं निम्नलिखित तरीके से अपनी इच्छानुसार यह सब काम करने में कामयाब रहा:
serializers.py
# serializer to use when showing a list
class ListaGruppi(serializers.HyperlinkedModelSerializer):
membri = serializers.RelatedField(many = True)
creatore = serializers.RelatedField(many = False)
class Meta:
model = models.Gruppi
# serializer to use when showing the details
class DettaglioGruppi(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Gruppi
views.py
class DualSerializerViewSet(viewsets.ModelViewSet):
"""
ViewSet providing different serializers for list and detail views.
Use list_serializer and detail_serializer to provide them
"""
def list(self, *args, **kwargs):
self.serializer_class = self.list_serializer
return viewsets.ModelViewSet.list(self, *args, **kwargs)
def retrieve(self, *args, **kwargs):
self.serializer_class = self.detail_serializer
return viewsets.ModelViewSet.retrieve(self, *args, **kwargs)
class GruppiViewSet(DualSerializerViewSet):
model = models.Gruppi
list_serializer = serializers.ListaGruppi
detail_serializer = serializers.DettaglioGruppi
# etc.
मूल रूप से मैं पता लगाता हूं कि जब उपयोगकर्ता एक सूची दृश्य या एक विस्तृत दृश्य और serializer_class
मेरी आवश्यकताओं के अनुरूप परिवर्तन का अनुरोध कर रहा है। मैं वास्तव में इस कोड से संतुष्ट नहीं हूं, हालांकि, यह एक गंदे हैक की तरह दिखता है और सबसे महत्वपूर्ण बात यह है कि अगर दो उपयोगकर्ता एक ही समय में एक सूची और एक विवरण का अनुरोध करते हैं?
क्या इसका उपयोग करने का एक बेहतर तरीका है ModelViewSets
या क्या मुझे वापस उपयोग करना पड़ता है GenericAPIView
?
संपादित करें:
यहां बताया गया है कि कस्टम बेस का उपयोग करके इसे कैसे करें ModelViewSet
:
class MultiSerializerViewSet(viewsets.ModelViewSet):
serializers = {
'default': None,
}
def get_serializer_class(self):
return self.serializers.get(self.action,
self.serializers['default'])
class GruppiViewSet(MultiSerializerViewSet):
model = models.Gruppi
serializers = {
'list': serializers.ListaGruppi,
'detail': serializers.DettaglioGruppi,
# etc.
}