9

Djangorestを使用する

以下は私が私のserializer.pyを持っていた方法です。

class ProfileSerializer(serializers.ModelSerializer):


    class Meta:
        model = Profile
        fields = ('id', 'name', 'active', 'type')

タイプはフラットビューです

次に、このようにプロファイルごとに「type」がネストされるように変更しました...

class TypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Type
        fields = ('id', 'name', 'active')

class ProfileSerializer(serializers.ModelSerializer):

    type = TypeSerializer()

    class Meta:
        model = Profile
        fields = ('id', 'name', 'active', 'type'')

これで完全に機能するようになりましたが、プロファイルの詳細が読み取り専用になっている場合にのみ、「type」を更新できるようになりました。

新しいプロファイルを作成するときにタイプを追加し、このネストされたビューを保持するにはどうすればよいですか?

私はこれを明確に説明したと思います。

アップデート:

わかりました、私はこれを読んだだけです:

注:ネストされたシリアライザーは、インスタンスの更新時に使用するとあいまいまたは非自明な動作をする場合があるため、読み取り専用の表現にのみ適しています。読み取り/書き込み表現の場合、RelatedFieldサブクラスの1つを使用して、常にフラット表現を使用する必要があります。

だからそれは理にかなっています。だから私はそれを...に変更しました。

type = serializers.PrimaryKeyRelatedField()

これでPOSTに戻されて機能しますが、残念ですが、「type」をIDと名前で表すことができないため、エンドユーザーにとってより意味がありますか?

4

3 に答える 3

13

書き込み可能なネストされたシリアライザーの完全なサポートは進行中の作業ですがcreate、当面の解決策の 1 つは、それぞれの場合にビューでメソッドをオーバーライドすることです。

class FooListCreateView(ListCreateAPIView):
    model = Foo
    serializer_class = FooSerializer

    def create(self, request, *args, **kwargs):
        data=request.DATA

        f = Foo.objects.create()

        # ... create nested objects from request data ...  

        # ...
        return Response(serializer.data, 
                        status=status.HTTP_201_CREATED,
                        headers=headers)

おそらく理想的ではありませんが、適切な方法が見つかるまではうまくいきます。

于 2013-02-20T11:50:05.320 に答える
5

これは現在サポートされています (バージョン 2.3.6 を使用していますが、以前に導入された可能性があります)。次のように、シリアライザーで直接使用できます。

class SongSerializer(serializers.ModelSerializer):
    class Meta:
        model = Song

class AlbumSerializer(serializers.ModelSerializer):
    songs = SongSerializer(many=True)

    class Meta:
        model = Album

それが役に立てば幸い :)

于 2013-07-01T19:04:07.473 に答える