2015-05-01 102 views
1

我有一個api,通過帶有額外訂單字段的manytomany模型檢索項目相關的所有項目。我現在試圖序列化其上的訂單值的項目。如何序列化來自反向相關模型的字段 - Django rest框架

一個解決辦法是通過模型序列化,但是,讓這樣的結果:

{ 
    "order": 1, 
    "item": { 
     "id": 3031, 
     "name": "Miami" 
    } 
}, 

我想,而不是序列化項目,並得到一個輸出像這樣:

{ 
    "order": 1, 
    "id": 3031, 
    "name": "Miami" 
} 

我無法將訂單添加爲項目模型的屬性,因爲它是一個很多的項目。或者我想我可以但必須採取列表的第一個對象,這不是我認爲非常乾淨的解決方案,並且可能會添加單獨的數據庫調用。

所有項目都取像這樣:

ProjectItem.objects.filter(project_id=self.kwargs['project_pk']).select_related('item') 

任何想法?

回答

3

如果你有一個穿透模型,那麼你應該序列化它並使用source額外的參數來「展平」表示。

例如,對於name,這將是

name = serializers.CharField(source='item.name') 

你可能會寫串行創建/更新方法,使這項工作可寫。

+0

好主意。我在回答中看到了一些不同的方法 – Christoffer

0

如果出於某種原因不想像@Linovia所建議的那樣通過貫穿模型,那麼您可以預取直通模型並使用帶有覆蓋的to_representation的RelatedField。

這是我做過什麼:

from django.db.models import Prefetch 

Item.objects.filter(projectitem_set__project_id=self.kwargs['project_pk']) 
    .prefetch_related(
     Prefetch('projectitem_set', queryset=ProjectItem.objects.filter(project_id=self.kwargs['project_pk']), to_attr='order')) 

隨後已將此添加到ItemSerializer(不添加多=真):

order = ProjectItemSerializer(read_only=True) 

並覆蓋在ProjectItemSerializer的to_representation:

class ProjectItemSerializer(serializers.RelatedField): 
    def to_representation(self, value): 
     return value[0].order 

value [0]獲取預取值的第一個對象

相關問題