আমি দুটি ভিন্ন সিরিয়ালাইজার সরবরাহ করতে চাই এবং তবুও এর সমস্ত সুবিধা থেকে উপকৃত হতে সক্ষম হতে চাই 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.
}