2017-03-16 46 views
-1

我正在使用嵌套的序列化程序。我需要ProfileSerializer才能返回完整的相關Project對象以獲取請求,並只考慮id切換(更改當前),例如ProfileSerializer上的post/put請求的relatedPrimaryField行爲。任何解決方案如何實現這一目標?DRF PrimaryRelatedField在讀寫時是否爲NestedSerializer?

class ProfileSerializer(serializers.ModelSerializer): 
    current = ProjectSerializer() 
    class Meta: 
     model = Profile 
     fields = ('function', 'current') 

回答

0

最一致的方式,我通常的建議是,以紀念(在這種情況下ProjectSerializer)的所有嵌套串行爲READ_ONLY並添加id字段作爲read_only=False

因此你必須列表之間的一致性/檢索和創建/更新。

+0

你將如何調用該字段(current_id)?你是否認爲沒有更簡單的方法來實現這一點,比如向嵌套序列化程序字段添加屬性,告訴它們在需要時切換到priamryrelated字段? –

+0

是的,這可以有不同的閱讀和寫作行爲。 iirc,這是第三方包(http://www.django-rest-framework.org/topics/third-party-packages/),但我們建議不要避免不一致。 – Linovia

0

正如Linova提到的,不使用第三方庫解決此問題的最簡單方法是在序列化程序中聲明兩個單獨的字段。你的嵌套序列化器current將保持不變,但你會添加一個新的PrimaryKeyRelatedField序列化器。嵌套序列化程序應該是隻讀的,但相關字段不會是隻讀的。我通常按​​照慣例命名相關字段<field>_id

在GET請求,無論是嵌套的串行和id場將被退回,但PUT或POST請求中僅指定了<field>_id需求。

class ProfileSerializer(serializers.ModelSerializer): 
    current = ProjectSerializer() 
    current_id = serializers.PrimaryKeyRelatedField(queryset=Projects.objects.all(), source='current') 
    class Meta: 
     model = Profile 
     fields = ('function', 'current', 'current_id')