2014-02-19 78 views
4

我正在使用Django-rest-framework來構建一個API。我有一個模型Chair我正在構建一個視圖。它有一個ManyToManyField對模型Tag,所以每個椅子有多個標籤。在Django rest框架中轉換`ManyToManyField`

Tag是一個Django模型,但是當與API交互時,我不想看到每個標記的JSON字典;我只想使用標籤的名稱。

E.g.在API中查看Chair的時候,我想看看它有這個:

{ 
    'tags': ['meow', 'frrr', 'nutella'], 
    ... Any other chair attributes 
} 

同樣,當我創建一個Chair,我希望能夠在標籤名稱的列表來傳遞,然後對每個他們的名字是get_or_create。 (所以我要麼使用現有的標籤名稱,要麼創建一個新的標籤。)

如何將所有這些邏輯放入我的序列化器/視圖集?

回答

2

在串行定義標籤字段,因爲這:

tags = serializers.SlugRelatedField(slug_field='name', many=True) 

現在的get_or_create行爲我的建議將是使用Django的形式。你將不得不重寫post方法(或者如果你正在使用viewset創建方法)並且編寫一個正常的使用表單創建東西的django方法。

查看request.DATA它是一個普通的python字典,用它作爲椅子形式的數據。

表單將接受這些數據,然後您可以正常驗證數據,就像使用django表單一樣。

然後使用創建一個椅子實例:

chair = form.save(commit=False) 
chair.save() 

一旦你的椅子實例與你,現在你可以使用添加許多標籤:

chair.tags.add(tag1, tag2, tag3...) 

要獲取標籤爲Python對象採取從request.DATA字典中取出標籤名稱列表並將名稱傳遞給get_or_create函數。你可以這樣做:

tags = [] 
tags_name_list = request.DATA['tags'] 
for tag_name in tags_name_list: 
    tag = Tag.objects.get_or_create(name=tag_name) 
    tags.append(tag) 

現在你有你的標籤列表。將它們添加到椅子上:

chair.tags.add(*tags)