Django - Создание нескольких различных объектов с отношениями в одной конечной точке Django
Есть ли способ создать конечную точку, которая создает несколько объектов? То, что я делал вместо этого, это принимал данные запроса и создавал объекты по одному за раз, а если один не удался, то удалял ранее созданные сущности, это кажется действительно очень халтурным, и должен быть лучший способ создания нескольких объектов. Итак, по существу, все Post
должны быть связаны с Goal
, так что когда приходит запрос, он будет сопровождаться данными, связанными с постом, и данными, связанными с целью в request.data
. Поэтому сначала нужно создать Goal
, а затем Post
, связанный с ним. Есть ли способ сделать это за один раз? Я предполагаю создать пользовательский сериализатор для обработки этого, но не уверен, как красноречиво обработать случай, когда если Post
не удается создать, я должен удалить Goal
.
model.py
class Goal(AbstractBaseModel):
creator_uuid = models.ForeignKey(
User, on_delete=models.SET_NULL, null=True, related_name="goal_creator_uuid")
goal_category = models.ForeignKey(GoalCategory, on_delete=models.CASCADE)
description = models.CharField(max_length=150, validators=[MinLengthValidator(5)])
class Post(AbstractBaseModel):
creator_uuid = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="post_creator_uuid")
goal_uuid = models.ForeignKey(Goal, on_delete=models.CASCADE)
body = post_body
view.py
def post(request):
"""
POST endpoint for current user creating a goal update post
"""
goal_serializer = GoalSerializer(data=request.data)
if goal_serializer.is_valid():
goal_obj = goal_serializer.save()
else:
# return Error
request.data['goal_uuid'] = str(goal_obj.uud)
post_serializer = PostSerializer(data=request.data)
if post_serializer.is_valid():
post_serializer.save()
else:
goal_obj.delete()
# return Error
Вы можете обернуть эти сериализаторы в атомарный блок с try...except
вот так:
from rest_framework.exceptions import ValidationError
def post(request):
try:
with transaction.atomic():
goal_serializer = GoalSerializer(data=request.data)
goal_serializer.is_valid(raise_exception=True)
goal_obj = goal_serializer.save()
request.data['goal_uuid'] = str(goal_obj.uud)
post_serializer = PostSerializer(data=request.data)
post_serializer.is_valid(raise_exception=True)
post_serializer.save()
except ValidationError as e:
# return 400 Response with e as details
# return 200 Response
Когда проверка сериализатора завершится неудачно (или если возникнет какое-либо исключение), произойдет автоматический откат всего, что находится в блоке atomic
. Затем вы можете поймать ValidationError
и построить нужный вам ответ.