Ich frage mich, was der beste Weg, dies zu lösen, ich habe eine verschachtelte Serializer wie folgt aus:Django Übriges Framework Objekt request.data hinzufügen und dann Serializer is_valid() aufrufen
serializers.py:
class PaymentMethodSerializer(serializers.ModelSerializer):
data = serializers.JSONField()
payment_type = PaymentTypeSerializer(required=False)
Dann sieht der Blick etwas wie folgt aus:
class PaymentMethodView(APIView):
def put(self, request, id):
try:
payment_method = PaymentMethod.objects.get(id=id)
except ObjectDoesNotExist:
return Response("No PaymentMethod with that id", status=status.HTTP_404_NOT_FOUND)
payment_method_serialized = PaymentMethodSerializer(instance=payment_method, data=request.data)
payment_type = request.data.get("payment_type", None)
if payment_type:
try:
payment_method_type = PaymentType.objects.get(id=payment_type)
except ObjectDoesNotExist:
payment_method_type = None
else:
payment_method_type = None
# Now, call is_valid()
if payment_method_serialized.is_valid():
payment_method_serialized.save(payment_type=payment_method_type)
return Response(payment_method_serialized.data, status=status.HTTP_200_OK)
is_valid()
Falsch zurück und dieser Fehler:
{"payment_type":{"non_field_errors":["Invalid data. Expected a dictionary, but got int."]}}
Ich verstehe es, ich gebe dem Serializer eine pk
. Ich möchte jedoch keinen neuen Serializer mit einer PrimaryKeyRelatedField
anstelle der geschachtelten Beziehung nur dafür erstellen. Wie kann ich die PaymentType
, die dieser pk
entspricht, und dann dieses Objekt dem request.data
Wörterbuch hinzufügen, so dass is_valid
nicht fehlschlägt? Ist das der beste Weg, dies zu lösen?
Dank Ivan. Obwohl ich dieser Lösung nicht gefolgt bin. Ich fand den letzten Absatz sehr hilfreich: "Sie können die payment_type-Validierung jedoch in einen Serializer verschieben. Überschreiben Sie to_intern_value, prüfen Sie den bereitgestellten PaymentType pk und werfen Sie eine Ausnahme, wenn sie falsch ist, und fangen Sie dann diese Ausnahme in einer Ansicht ab." Deshalb habe ich diese Antwort akzeptiert. – alejoss
@alejoss Ihr Willkommen –