2015-04-01 36 views
1

以下車型Django的REST框架視圖由具有不同的對象序列化

class TreeLifephase(DBordered): 
    name = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.name 

class TreeWidth(DBordered): 
    name = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.name 

,還有更多像這樣的,包含我的Tree對象的可編輯屬性。有關UI一個選擇字段我想擁有所有可用treelifephases和treewidths一個查詢 - 有一個JSON結果,看起來像

{ 
    "treelifephases": [ 
     { 
      "id": 1, 
      "name": "young" 
     }, 
     { 
      "id": 2, 
      "name": "medium" 
     }, 
     { 
      "id": 3, 
      "name": "old" 
     } 
    ], 
    "treewidths": [ 
     { 
      "id": 1, 
      "name": "10-20cm" 
     }, 
     { 
      "id": 2, 
      "name": "21-30cm" 
     }, 
     { 
      "id": 3, 
      "name": "31-40cm" 
     } 
    ] 
} 

我手頭的型號序列化,這將是真棒,以有一個觀點,可以得到一個序列化器的列表來返回像上面這樣的結果集。

+1

您可以使用SerializerMethodFields來生成自定義字段,我傾向於使用不同的串行器來生成條目和條目表示。 – petkostas 2015-04-01 15:45:19

+0

我明白你的意思,但我怎麼會得到一個視圖然後,似乎總是需要一個查詢集(一種類型?) – niklas 2015-04-01 23:06:10

+0

換句話說:我的問題似乎是做一個視圖,可以區分不同的模型'queryset'還是有不同的方式,我不在這裏看到? – niklas 2015-04-01 23:12:29

回答

2

您可以使用SerializerMethodField,您需要創建一個模型,才能使用模型序列化程序。

class FullTree(serializers.ModelSerializer): 
    full_tree = serializers.SerializerMethodField() 

    class Meta: 
      model = FullTreeModel 
      fields = ('treewidth','lifephase') 



    get_full_tree(obj): 
     treewidth = obj.treewidths # get all your treewidth 
     lifephase = obj.lifephases# get all your lifephases 
     //build your tree with your serializers 
     return your_full_tree 
+0

視圖集的queryset值如何與您的mastertree序列化程序配合使用?我不需要'FullTreeModel'嗎? – niklas 2015-04-01 23:10:51

+0

@ user9它只是一個簡單的序列化程序,您可以初始化它傳遞實例樹。 – levi 2015-04-01 23:16:31

+0

是的,但我想要的不是樹的樹寬和生命期,而是所有可用的樹寬和生命期。對不起,如果我不清楚這一點 – niklas 2015-04-01 23:17:39

0

我想出了我的使用情況下,一個很好的解決方案,我在上面的問題claryfied:

1:我寫了一個串行只給我的idname

class IDNameSerializer(serializers.BaseSerializer): 
    def to_representation(self, obj): 
     return { 
      'id': obj.id, 
      'name': obj.name 
     } 

第二篇:我寫了一個視圖,它給了我所需的json響應,並在django-rest-framework的@api-view裝飾器幫助下提供了所需的json響應

from rest_framework.decorators import api_view 
from rest_framework.response import Response 

@api_view(['GET']) 
def tree_select(request): 
    result = {} 
    result['treelifephases'] = IDNameSerializer(TreeLifephase.objects.all(),many=True).data 
    result['treewidths'] = IDNameSerializer(TreeWidth.objects.all(),many=True).data 
    return Response(result) 

爲什麼我選擇這個作爲一個答案:

  • 通過使用@api_view裝飾的,我們仍然可以使用權限類和其他糖
  • 它給出了要求的格式JSON響應
  • 它很容易改變,當新的領域可能來到那裏只有視圖要改變
  • 我不需要django模型只用於序列化
  • 這很簡單!
相關問題