Как получить значение первичного ключа в ответе post в работе с фреймом django rest

#python #django #python-3.x #django-rest-framework

#python #django #python-3.x #django-rest-framework

Вопрос:

Я использую фреймворк Django Rest. Я использую метод post. После вызова метода post мне нужно получить первичный ключ в этом ответе post call.

Это мой код сериализатора:

 from rest_framework import serializers
from .models import ImtsRequest, MercadoPagoPayment

class MercadoPagoPaymentSerializer(serializers.ModelSerializer):
    # paymentRequestID = serializers.IntegerField(read_only=False)
    class Meta:
        model = MercadoPagoPayment
        fields = '__all__'
        # read_only_fields = ('CreatedDateTime','paymentRequestID')
        
    def create(self, validated_data):
        data = MercadoPagoPayment(token = validated_data['token'], payment_method_id = validated_data['payment_method_id'], issuer_id = validated_data['issuer_id'],installments = validated_data['installments'], order_id = validated_data['order_id'], payer_email = validated_data['payer_email'], transaction_amount = validated_data['transaction_amount'], capture = validated_data['capture'], requestjsondata = validated_data['requestjsondata'])
        data.save()
        print(data.paymentRequestid)
        return data  

Это моя модель:

 from django.db import models

# Create your models here.


class MercadoPagoPayment(models.Model):
    paymentRequestid = models.AutoField(db_column="paymentRequestid", primary_key=True)
    token = models.CharField(max_length=32, blank=False, null=True)
    payment_method_id = models.CharField(max_length=10, blank=True, null=True)
    issuer_id = models.IntegerField(db_column='Issuer_id', null=True)
    installments = models.IntegerField(db_column='installments', null=True)
    order_id = models.CharField(max_length=32, blank=False, null=True)
    payer_email = models.CharField(max_length=200, blank=True, null=True)
    transaction_amount = models.FloatField(blank=False, null=False)
    capture = models.BooleanField(default=False)
    requestjsondata = models.TextField(db_column='requestjsondata', null=True)
    CreatedDateTime = models.DateTimeField(db_column='CreatedDateTime', null=False, auto_now_add=True)  # Field name made lowercase.

    class Meta:
        managed = True
        db_table = 'MercadoPago_Payment'  

Это мое мнение:

 from django.shortcuts import render
from django.http import Http404, HttpResponse, JsonResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from rest_framework import status, generics
from .serializers import *
from .models import *
import json

# Create your views here.


class MercadopagoCreatePayment(APIView):
    def post(self, request, format=None):
        request.data['requestjsondata'] = json.dumps(request.data['requestjsondata'])
        requestData = MercadoPagoPaymentSerializer(data = request.data)
        if requestData.is_valid():
            requestData.save()
        return Response(request.data, status=status.HTTP_201_CREATED)                 

Я получил paymentRequestid в методе создания сериализаторов. Но я не смог получить этот идентификатор в ответе.

Как я могу получить этот первичный ключ?

Благодарю вас

Комментарии:

1. Появляется ли «paymentRequestid» request.data непосредственно перед тем, как вернуть его в качестве ответа?

2. запрос. у данных нет этой переменной. Потому что это автоматически сгенерированное значение.

3. Использовать вывод requestData.save()

4. @IvanStarostin я понял. Спасибо

Ответ №1:

requestData.save() возвращает первичный ключ и все поля. Это ответ, возвращаемый сериализатором.

 from django.shortcuts import render
from django.http import Http404, HttpResponse, JsonResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from rest_framework import status, generics
from .serializers import *
from .models import *
import json

# Create your views here.


class MercadopagoCreatePayment(APIView):
    def post(self, request, format=None):
        request.data['requestjsondata'] = json.dumps(request.data['requestjsondata'])
        requestData = MercadoPagoPaymentSerializer(data = request.data)
        if requestData.is_valid():
            SerializerResponse = requestData.save()
            request.data['id'] = SerializerResponse.pk
        return Response(request.data, status=status.HTTP_201_CREATED)