ビューセットの「create」メソッドと「update」メソッドに同じモデルのシリアライザーを使用するにはどうすればよいですか。

FlashBanistan

新しいクライアントが作成されたら、「domain_url」と等しいかどうかを確認できるように、「confirm_domain_url」を返送する必要があります。createメソッドでserializer.is_valid()を呼び出すと、意図したとおりに機能します。クライアントが更新されると、「domain_url」が欠落しているとの通知に失敗します。updateメソッド用の新しいシリアライザーを作成できることはわかっていますが、できるだけ多くのコードを統合したいと思います。

シリアライザー:

class ClientSerializer(ModelSerializer):
    confirm_domain_url = CharField(write_only=True)
    class Meta:
        model = Client
        fields = [
            'name',
            'schema_name',
            'domain_url',
            'created_on',
            'id',
            # Write only fields (won't be returned in the response):
            'confirm_domain_url',
        ]

    def validate(self, data):
        # Check that domain urls match:
        if data['domain_url'] != data['confirm_domain_url']:
            raise ValidationError('Domain urls do not match.')
        return data

    def create(self, validated_data):
        client = Client(
            name = validated_data['name'],
            schema_name = validated_data['schema_name'],
            domain_url = validated_data['domain_url'],
        )
        client.save()

        return client

ViewSet:

class ClientViewSet(viewsets.ViewSet):

    def list(self, request):
        queryset = Client.objects.all()
        serializer = ClientSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        queryset = Client.objects.all()
        client = get_object_or_404(queryset, pk=pk)
        serializer = ClientSerializer(client)
        return Response(serializer.data)

    def create(self, request):
        serializer = ClientSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        queryset = Client.objects.all()
        client = queryset.get(pk=pk)
        serializer = ClientSerializer(client, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)
AJパー

属性がシリアライザーに割り当てられているClientSerializer.validateかどうかをチェックするチェックをメソッドに追加できinstanceます。インスタンスがシリアライザーで定義されている場合、それは更新操作になります。そうでない場合、更新するインスタンスがありません。だから、これはのみチェックしますdomain_urlに対してconfirm_domain_url作成するとき。

class ClientSerializer(ModelSerializer):
    ...

    def validate(self, data):
        # Check that domain urls match:
        if self.instance is None and data['domain_url'] != data['confirm_domain_url']:
            raise ValidationError('Domain urls do not match.')
        return data

    ...

編集-validateメソッドのifステートメントの論理順序を変更しました。問題はdata['domain_url']、条件の最初の部分でアクセスしようとしていたため、KeyErrorが発生したことです。self.instance is None最初にチェックするので、これはifステートメントを短絡しdata['domain_url']、インスタンスが定義されている場合はアクセスを試みません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ