Как я могу получить доступ к созданному экземпляру с помощью сериализатора в представлении?
У меня есть модельсериализатор, который создает новый экземпляр модели в случае пост-запросов к конечной точке.
Как я могу захватить только что созданный экземпляр в представлении для дальнейшей обработки? (Мне нужен идентификатор нового экземпляра для связанной модели).
# serializers.py
class OfferList(APIView):
"""
List all Offers or create a new Offer related to the authenticated user
"""
def get(self, request):
offers = Offer.objects.filter(company__userprofile__user=request.user)
serializer = OfferSerializer(offers, many=True)
return Response(serializer.data)
def post(self, request):
serializer = OfferSerializer(data=request.data)
if serializer.is_valid():
# Get the related company instance
company = get_object_or_404(Company, userprofile__user=request.user)
# Pass the related instance to the serializer instance to save the new Offer instance
serializer.save(company=company)
# Create Payment instances - returns a dict
payments = create_payments(
serializer.data.get('start_salary'),
serializer.data.get('months'),
serializer.data.get('start_date'),
serializer.data.get('interest_type'),
serializer.data.get('interest_interval'),
serializer.data.get('interest_raise')
)
# Loop the dict and generate instances
for key, value in payments.items():
Payment.objects.create(
offer= , # how to access the id of the created instance by the serializer above?
month=key,
amount=value
)
return Response(serializer.data,
status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# models.py
class Payment(models.Model):
"""
A table to store all payments derived from an offer.
"""
# Each monthly payment relates to an offer
offer = models.ForeignKey(Offer, on_delete=models.CASCADE)
month = models.DateField()
amount = models.PositiveIntegerField()
Как говорится в документации django-rest-framework,
Если ваши экземпляры объектов соответствуют моделям Django, вы также захотите убедиться, что эти методы сохраняют объект в базе данных. Теперь при десериализации данных мы можем вызвать
.save(), чтобы вернуть экземпляр объекта, основанный на проверенных данных.
Вызов.save()приведет либо к созданию нового экземпляра, либо к обновлению существующего, в зависимости от того, был ли передан существующий экземпляр при инстанцировании класса сериализатора.
Так что вы можете сделать следующее, чтобы захватить только что созданный экземпляр:
instance = serializer.save(company=company)