2017-04-20 22 views
2

我有一個非常簡單的模型及其相關的串行和看法:Django的REST框架不能處理模型multple對象視圖集中

class Page(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=255) 
    pub_date = models.DateTimeField(default=timezone.now) 

class PageSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Page 
     fields = ('user', 'title', 'pub_date') 

class PageViewSet(viewsets.ModelViewSet): 
    queryset = Page.objects.all() 
    serializer_class = PageSerializer 

現在我可以張貼這樣的:

{ 
    "user": 1, 
    "title": "Lorem ipsum" 
} 

該作品精細。不過,我想發佈多個對象是這樣的:

[ 
    { 
     "user": 1, 
     "title": "Lorem ipsum one" 
    }, 
    { 
     "user": 1, 
     "title": "Lorem ipsum two" 
    } 
] 

但是這給了我一個錯誤:

"non_field_errors": [

"Invalid data. Expected a dictionary, but got list." 

]

所以接受multple對象我修改了視圖as per the doc

class PageViewSet(viewsets.ModelViewSet): 
    queryset = Page.objects.all() 
    serializer_class = PageSerializer(queryset, many=True) 

但我得到一個錯誤:

TypeError at /api/blog/pages/

'ListSerializer' object is not callable

我在這裏錯過了什麼?

回答

3

你有它之前正確設置,則serializer_class應指向這樣的類:

serializer_class = PageSerializer 

你是對的上的錯誤,它並不像在POST接收多個對象。解決這個問題的一種方法是在視圖中重寫get_serializer方法,並在其中添加許多= True。

喜歡的東西:

def get_serializer(self, *args, **kwargs): 
    if "data" in kwargs: 
     data = kwargs["data"] 

     # check if many is required 
     if isinstance(data, list): 
      kwargs["many"] = True 

    return super(PageViewSet, self).get_serializer(*args, **kwargs) 

要回答你的問題的意見:isinstance()是一個Python方法來檢查對象的類型。在這種情況下,傳遞多個對象時是list,所以我們只檢查data是什麼類型,如果它是list,則設置爲many=true

DRF docs regarding get_serializer (under methods)

Python docs regarding isinstance

+0

哇...謝謝你。我沒有在'isinstance()'方法中顯示任何文檔。你能否指出我在哪裏,或者詳細說明如何使用'isinstance()'。 – Robin

+0

沒問題,很高興幫助。我已經更新了我的答案,以提供更多信息。 –

+0

非常感謝! – Robin