2017-03-16 13 views
-1

ネストされたシリアライザを使用しています。私はProfileSerializerの関連するProjectオブジェクトを取得要求のために返すために、ProfileSerializerにpost/put要求のrelatedPrimaryField behaiviourのようにIDの切り替え(現在の変更)のみを考慮する必要があります。どのようにこれを達成するためのソリューション?書き込み時はDRF PrimaryRelatedField、読み取り時はNestedSerializer?

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

答えて

0

私は通常のアドバイスは、あなたがそのためのリストの間で一貫性を持っているでしょうとしてREAD_ONLY(この場合はProjectSerializer)すべてのネストされたシリアライザをマークし、read_only=False

としてidフィールドを追加することで、最も一貫性のある方法/検索と作成/更新が含まれます。

+0

どのようにそのフィールド(current_id)を呼び出しますか?ネストしたシリアライザフィールドに属性を追加して、必要に応じてpriamryrelatedfieldに切り替えるようにするなど、これを達成するためのよりクリーンな方法はないと思いますか? –

+0

はい、読み取りと書き込みの動作が異なる場合があります。 iirc、そのための第三者のパッケージがありますが(http://www.django-rest-framework.org/topics/third-party-packages/)、矛盾を避けるためではありません。 – Linovia

0

Linovaが述べたように、サードパーティのライブラリを使用せずにこの問題を解決する最も簡単な方法は、シリアライザに2つの独立したフィールドを宣言することです。入れ子になったシリアライザ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') 
関連する問題