2016-08-31 12 views
1

私はタイトルが馬鹿に聞こえるが、私のUserインスタンスのGroupオブジェクトへの参照を変更できるようにしたいと考えています。しかし、私は彼らが新しいグループを作成したり、既存のグループを編集したりすることはできません。私が望むのは、読み取り専用のネストされたフィールドだと思います。しかし、私がread_only=Trueに設定した場合、私はシリアライザのデータの検証データを取得しません。 read_only=Falseに設定すると、参照を変更するだけでなく、新しいGroupを作成しようとします。DRFの読み取り専用のネストされたフィールドを変更

class GroupSerializer(serializers.ModelSerializer): 
    permissions = PermissionSerializer(many=True) 

    class Meta: 
     model = Group 
     fields = (
      'pk', 
      'name', 
      'permissions', 
     ) 

class UserSerializer(serializers.ModelSerializer): 
    groups = GroupSerializer(many=True) 
    .... 

    class Meta: 
     model = User 
     exclude = (
      .... 
     ) 

    def update(self, instance, validated_data): 
     print(validated_data) 
     return instance 

    def validate_groups(self, value): 
     print("validating groups") 
     .... 
     return value 

read_only=Trueとは何も起こりません。私はPATCHリクエストでユーザーを元に戻しますが、ユーザーはまったく同じです。 read_only=Falseで、私は、私もGroupSerializerでなく、変更なしでcreateupdateメソッドをオーバーライドしようとしている{'groups': [{'name': ['group with this name already exists.']}]}

検証エラーが私に戻って取得します。

ほとんどの場合、GroupSerializerは、データのグループが存在することを検証するだけです。

+0

これはhttp://stackoverflow.com/questions/38438167/unique-validation-on-nested-serializer-on-django-rest-framework/と同じです。 – Linovia

答えて

0

私が見つけた最も良い解決策は、PrimaryKeyRelatedFieldを使用することでした。これは、既に存在するアイテムを選択してオブジェクトに関連付けることができる読み取り専用インターフェイスを提供します。

悲しいことに、GETタイプのビューでこれらのオブジェクトを表示すると、関連オブジェクトの詳細は表示されず、PKと表示されます。私はすぐにこれを回避しようとしています。おそらく、マルチシリアライザのビューセットはそのトリックを行います。

Here are the docs

0

本当に後半の答えが、私はここにStackOverflow上の別のスレッドで、このつまずいた(残念ながら私は今それを見つけることができない)、そして、彼らは、次のdiscussionに言及しました。

私が使用した解決策は、読み込み用と書き込み用の2つのシリアライザと、正しいミックスインを含む2つのそれぞれのビューセットを作成することでした。したがって、GETメソッドを使用する場合は入れ子になった外部キーを、FK関係の既存のモデルの場合は識別子を使用してPOSTのみをリストすることができました。私はdepth属性を使用しました。私はこの問題に関係することを願っています。

関連する問題