我想提供两个不同的序列化程序,并且能够从ModelViewSet的所有功能中获益:
- 查看对象列表时,我希望每个对象都有一个url,该url将重定向到其详细信息,并使用目标模型的
\uuuuuuuunicode\uuuuuuu显示其他关系
例如:
{
“url”:”http://127.0.0.1:8000/database/gruppi/2/",
“nome”:“universitari”,
“描述”:“unitn!”,
“创造者”:“埃米利奥”,
“附属品”:“气”,
“membri”:[
“埃米利奥”,
“米歇尔”,
“路易莎”,
“伊万”,
“萨维里奥”
]
}
- 查看对象的详细信息时,我希望使用默认的
HyperlinkedModelSerializer
例如:
{
“url”:”http://127.0.0.1:8000/database/gruppi/2/",
“nome”:“universitari”,
“描述”:“unitn!”,
“创造者”:http://127.0.0.1:8000/database/utenti/3/",
“附属品”:“气”,
“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/"
]
}
我通过以下方式实现了我的愿望:
序列化程序.py
显示列表时要使用的序列化程序
类ListaGruppi(序列化程序.HyperlinkedModelSerializer):
membri=serializers.RelatedField(many=True)
creatore=serializers.RelatedField(many=False)
类元:
model=models.Gruppi
#显示详细信息时要使用的序列化程序
类DettaglioGruppi(序列化程序.HyperlinkedModelSerializer):
类元:
model=models.Gruppi
视图.py
类DualSerializerViewSet(ViewSet.ModelViewSet):
“””
ViewSet为列表视图和详图视图提供不同的序列化程序。
使用list_序列化程序和detail_序列化程序提供它们
“””
def列表(自身、*args、**kwargs):
self.serializer\u class=self.list\u序列化程序
返回viewset.ModelViewSet.list(self、*args、**kwargs)
def检索(self、*args、**kwargs):
self.serializer\u class=self.detail\u序列化程序
返回viewset.ModelViewSet.retrieve(self、*args、**kwargs)
类GruppiViewSet(DualSerializerViewSet):
model=models.Gruppi
list_serializer=serializers.ListaGruppi
detail_serializer=serializers.DettaglioGruppi
#等等。
基本上,我会检测用户何时请求列表视图或详细视图,并更改serializer\u class以满足我的需要。不过我对这段代码并不满意,它看起来像是一个肮脏的黑客行为,最重要的是,如果两个用户同时请求列表和详细信息怎么办?
使用ModelViewSets是否有更好的方法来实现这一点,还是必须使用GenericAPIView
编辑:
下面介绍如何使用自定义基本视图集进行此操作:
类MultiSerializerViewSet(ViewSet.ModelViewSet):
序列化程序={
“默认”:无,
}
def get_序列化程序_类(自身):
返回self.serializers.get(self.action,
self.serializers['default'])
GruppiViewSet类(MultiSerializerViewSet):
model=models.Gruppi
序列化程序={
“列表”:serializers.ListaGruppi,
“详细信息”:serializers.DettaglioGruppi,
#等等。
}
重写get\u serializer\u类方法。此方法在模型混合中用于检索适当的序列化程序类
请注意,还有一个get\u serializer方法,它返回正确序列化程序的实例
类DualSerializerViewSet(ViewSet.ModelViewSet):
def get_序列化程序_类(自身):
如果self.action==’list’:
返回serializers.ListaGruppi
如果self.action==“检索”:
返回serializers.DettaglioGruppi
返回序列化程序。默认值#我不知道创建/销毁/更新需要什么。