新しいクライアントが作成されたら、「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)
属性がシリアライザーに割り当てられている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]
コメントを追加