İki farklı serileştirici sağlamak ve henüz tüm olanaklarından yararlanabilmek istiyorum ModelViewSet
:
- Nesnelerin bir listesini görüntülerken, her nesnenin ayrıntılarına yönlendiren bir url'ye sahip olmasını ve diğer her ilişkinin
__unicode __
hedef modeli kullanarak görünmesini isterim ;
misal:
{
"url": "http://127.0.0.1:8000/database/gruppi/2/",
"nome": "universitari",
"descrizione": "unitn!",
"creatore": "emilio",
"accesso": "CHI",
"membri": [
"emilio",
"michele",
"luisa",
"ivan",
"saverio"
]
}
- Bir nesnenin ayrıntılarını görüntülerken, varsayılanı kullanmak istiyorum
HyperlinkedModelSerializer
misal:
{
"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/"
]
}
Tüm bu çalışmaları dilediğim gibi yapmayı başardım:
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.
Temel olarak, kullanıcının bir liste görünümü veya ayrıntılı bir görünüm istediğini ve serializer_class
ihtiyaçlarıma uygun olarak değiştirdiğini tespit ederim. Gerçi bu koddan gerçekten memnun değilim, kirli bir kesmek gibi görünüyor ve en önemlisi, iki kullanıcı aynı anda bir liste ve detay isterse ne olur?
Bunu kullanarak başarmanın daha iyi bir yolu var mı yoksa kullanarak ModelViewSets
geri çekilmem gerekiyor GenericAPIView
mu?
EDIT:
Özel bir taban kullanarak nasıl yapılacağı aşağıda açıklanmıştır 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.
}