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 и построить нужный вам ответ.

Вернуться на верх