我使用Django的REST的框架。我有一個關係模型。我想只顯示相關項目的數量,當用戶點擊URL /modelname/
,但顯示的全組相關,當用戶在/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'方法? –