Обновление поля в модели django с отношением "один ко многим". Необходимо заменить метод сохранения

У меня есть две модели Django в файле models.py с именами Cases и CaseItems. Они имеют отношение один ко многим, где Case может иметь несколько CaseItems. Ниже приведены классы моих моделей.

class Item(models.Model):
    name = models.TextField(unique=True)
    # Price is in cents
    price = models.PositiveIntegerField(
        validators=[
            MinValueValidator(1)
        ]
    )
    img = models.TextField()


class Case(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid4)
    name = models.TextField(unique=True)
    case_img = models.TextField()
    total_price = models.PositiveIntegerField(default=0)

class CaseItem(models.Model):
    case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name="items")
    item = models.ForeignKey(Item, on_delete=models.PROTECT)
    percentage = models.PositiveIntegerField(
        validators=[
            MaxValueValidator(100),
            MinValueValidator(1)
        ]
    )

    # ensure that user cant add the same item to the case
    class Meta:
        unique_together = [['case', 'item']]
    
    def save(self, *args, **kwargs):
        self.case.total_price += self.item.price
        self.case.save()
        super().save(*args, **kwargs)

Проблема заключается в поле total_price модели Case. Я хочу, чтобы всякий раз, когда CaseItem создается и связывается с Case, он должен обновлять поле total_price в Case. Например, если я создаю дело, элементы дела добавляются в новую таблицу, но мне нужно обновить и поле total_price дела. В настоящее время при создании дела это поле инициализируется значением по умолчанию 0. Где я ошибаюсь?

Это представление для создания дела:

class CreateCustomCase(generics.CreateAPIView):
    serializer_class = CustomCaseSerializer

    def create(self, request, *args, **kwargs):
        data = request.data.copy()
        serializer = self.get_serializer(data=data, context={'request': request})

        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.validated_data, status.HTTP_201_CREATED)

        return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)

и это сериализатор, который я использую. Пожалуйста, помогите. Я новичок в django.

class CustomCaseSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=None)
    case_img = serializers.CharField(max_length=None)
    items = CustomCaseItemSerializer(many=True)

    def validate(self, attrs):
        items = attrs.get("items")
        case_name = attrs.get("name")

        try:
            caseObj = Case.objects.get(name=case_name)
        except Case.DoesNotExist:
            caseObj = None

        if caseObj is not None:
            raise serializers.ValidationError("Case with the same alredy exists")

        sumPercentage = sum([item["percentage"] for item in items])

        if sumPercentage != 100:
            raise serializers.ValidationError("Total Sum of percentage should be 100%")

        itemIdList = [item["id"] for item in items]
        selectIds = Item.objects.filter(pk__in=itemIdList).values('id')
        selectIdList = [selectId["id"] for selectId in selectIds]

        if len(selectIdList) != len(itemIdList):
            notInSelect = set(itemIdList).difference(selectIdList)
            raise serializers.ValidationError(
                f'Did not find the following items with id in the database: {notInSelect}'
Вернуться на верх