2

分析

要約すると、以下が機能すると予想されるはずであり、解決策を以下に示します。他の誰かがこれで迷子になった場合に備えて、質問を残しました。

元の質問

Django M2M チュートリアルには、ピザとトッピングがあります。アプリケーションの一部として、M2M フィールドであるトッピングと、新しいトッピングを追加するためのエンドポイントがあります。ただし、トッピングがまだ存在しない場合にのみ追加したいのですが、それ以外の場合は既存のものを返したいだけです。これは、ピザとトッピングの間のネストされた M2M 関係が問題を引き起こすのを避けるためです。代わりに、ピザ用とトッピング用の 2 つのエンドポイントがあり、トッピングがpost_saveビューに追加されます。

ただし、以下は機能しないようです。

class ToppingSerializer(serializers.ModelSerializer):
    another_model = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Topping
        fields = ('id', 'another_model', 'name')

    def save_object(self, obj, **kwargs):
        topping = Topping.objects.get_or_create(another_model=obj.another_model,
                                                name=obj.name)
        return topping

以下のビューコードを使用します。

    [snip - View code below]
    serializer_class = ToppingSerializer

    serializer = self.get_serializer(data=request.DATA, many=True)
    if serializer.is_valid():
        serializer.save()
        return Response(status=status.HTTP_201_CREATED)
    [snip]
4

2 に答える 2