【发布时间】:2014-03-23 15:19:27
【问题描述】:
我正在使用 django-rest-framework。我有一个有关系的模型。我只想在用户点击/modelname/ URL 时显示相关项目的数量,但在用户点击/modelname/1/ 的特定模型实例时显示完整的相关集。
我可以几乎得到我想要的。
我有两个序列化器,如下所示:
class DataSetSerializer(serializers.ModelSerializer):
revisions = serializers.RelatedField(source='datasetrevision_set', many=True)
class Meta:
model = DataSet
fields = ('id', 'title', 'revisions')
class ShortDataSetSerializer(serializers.ModelSerializer):
class Meta:
model = DataSet
fields = ('id', 'title', 'revisions')
如果我使用简短版本,我会得到修订计数(这是一个计算字段)。如果我使用长版本,我会获得相关项目的完整列表作为“修订”。
短:
[{"id": 1, "title": "My Data Set", "revisions": 0}]
长:
[{"id": 1, "title": "My Data Set", "revisions": ["Data Set v1", "Data Set v2"]}]
我想要做的是能够根据查询参数(url)在它们之间切换。当 ID 不存在时,我尝试将 serializer_class 设置为 ShortDataSetSerializer,但它会覆盖所有情况,而不仅仅是非 ID 情况。
class DataSetViewSet(viewsets.ModelViewSet):
serializer_class = DataSetSerializer
model = DataSet
def get_queryset(self):
try:
id = self.kwargs['id']
queryset = DataSet.objects.filter(id=id)
except KeyError:
queryset = DataSet.objects.all()
# We want to only list all of the revision data if we're viewing a
# specific set, but this overrides for all cases, not just the one
# we want.
self.serializer_class = ShortDataSetSerializer
return queryset
有什么方法可以让我完成这项工作吗?我意识到我可能会以一种完全荒谬的方式来解决这个问题,但似乎应该有一个简单的解决方案。
与我正在使用的真实数据相比,我给出的数据示例相当简略。最终目标是在列表视图中显示字段的子集,并在 GET 中显示特定 ID 的每个字段。这是一个只读 API,所以我不需要担心 POST/PUT/DELETE。
【问题讨论】:
-
简单但更多余的答案是只使用两个视图集。
-
您是否尝试过覆盖
get_serializer_class方法?
标签: python json django rest django-rest-framework