我希望提供两种不同的序列化程序,同时又能够从modelviewset
的所有功能中获益:
__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.
}
重写get_serializer_class
方法。在模型mixin中使用此方法检索正确的序列化程序类。
注意,还有一个get_serializer
方法,它返回正确的序列化程序的实例
class DualSerializerViewSet(viewsets.ModelViewSet):
def get_serializer_class(self):
if self.action == 'list':
return serializers.ListaGruppi
if self.action == 'retrieve':
return serializers.DettaglioGruppi
return serializers.Default # I dont' know what you want for create/destroy/update.
问题内容: 我想提供两个不同的序列化器,但仍然可以从以下所有功能中受益: 当查看对象列表时,我希望每个对象都有一个重定向到其详细信息的url,并使用目标模型来显示其他所有关系。 例: 查看对象的详细信息时,我想使用默认值 例: 我设法按照以下方式完成了所有这些工作: serializers.py views.py 基本上,我会检测用户何时请求列表视图或详细视图,并进行更改以满足我的需求。不过,我对
我想在同一框架中使用2个面板。但是button不起作用了?我该怎么做?我想在一个面板上放几个按钮,另一个面板会做一些其他的事情。
我在序列化和反序列化同一JVM中的对象列表时遇到问题。确切地说,现在我的对象与对象具有相同的引用,它有以下规则: 现在在我的对象列表反序列化之后,在某个时候字母表引用不匹配。我用以下方法检查了一下: 得到了以下结果 现在看看VMId,既然它们是相同的,那么它不应该是相同的对象吗,就像上面的逻辑一样?谢谢你的帮助。
问题内容: 我有一个带有两个DateTime属性的类。我需要使用不同的格式序列化每个属性。我该怎么做?我试过了: 该解决方案不适用于我,因为它将日期格式应用于所有属性。有什么方法可以序列化具有不同格式的每个DateTime属性?也许有一些属性? 问题答案: 具有难以理解的结构,您可以使用以下自定义转换器之类的工具来执行所需的操作:
问题内容: 假设您正在Rails中实现REST API。在提供集合时,您可能只希望包含一些属性: 但是在提供单个资源时,您要包括所有属性: 我看不到如何使用ActiveModel :: Serializers来做到这一点,因为这些示例都使用了一种模式,即为每个模型定义一个序列化器(使用标准命名约定),并让AMS在执行操作时自动在控制器中使用正确的序列化器: 要么: 问题答案: 为避免将视图关注点混
问题内容: 我可能会尝试以困难的方式执行此操作,所以请让我知道是否有更好的解决方案。 我正在用Java开发一个简单的文字游戏,您可以通过GUI选择动作。我有几个班级正在尝试序列化一个是播放器,另一个是NPC。是否有一种简单的方法可以将一个以上的对象(播放器和NPC)序列化到同一文件中?我可以序列化一个对象并将其加载回游戏中。 我会以错误的方式处理吗?有没有更简单的方法来尝试保存游戏状态? 如果我有