Django обновление или создание - предварительное сохранение

Я пытаюсь решить, возможно, простую проблему. Я пытаюсь создать запись или обновить уже существующую запись. Я пытаюсь переопределить функцию сохранения модели. Критерии основаны на том, есть ли пользователь, у которого уже есть ответ для его exp_type. Я хочу обновить его, если да, если нет, то создать его.

Вот что у меня есть:

class UserExperienceTypeAnswer(TimeStampedModel):
    NA, NONE, SOME, LOTS, EXPERT = range(5)
    ANSWER_CHOICES = {
        (NA, "Not interested"),
        (NONE, "None"),
        (SOME, "Some"),
        (LOTS, "Lots"),
        (EXPERT, "Expert"),
    }

    user = models.ForeignKey(User, models.CASCADE, null=False, blank=False)
    exp_type = models.ForeignKey(
        RecruitmentExperienceType, models.CASCADE, null=False, blank=False
    )
    answer = models.PositiveSmallIntegerField(
        choices=ANSWER_CHOICES, default=NONE, blank=False, null=False
    )

    unique_together = ["user", "exp_type"]

    def save(self, *args, **kwargs):
        record = UserExperienceTypeAnswer.objects.filter(
            user=self.user, exp_type=self.exp_type
        ).first()

        if not record:
            super(UserExperienceTypeAnswer, self).save(*args, **kwargs)
        else:
            //This is the part im unsure of. I tried to save the record from query above
            record.answer = self.answer
            super(UserExperienceTypeAnswer, record).save(*args, **kwargs)
            // This gives duplicate key error (which i assume is because its trying to create new record)
           
            // I also tried to create model directly but this creates recursion error (as i assume i am calling this method on save in infinate loop. 
            UserExperienceTypeAnswer.objects.create(
                 user=self.user, exp_type=self.exp_type, answer=self.answer
            )

По предложению Christophes, я добавил это в viewset, как показано ниже. Это представление DRF, поэтому я использовал функцию create.

class UserExperienceTypeAnswerViewset(viewsets.ModelViewSet):

    queryset = models.UserExperienceTypeAnswer.objects.all().order_by("id")
    serializer_class = serializers.UserExperienceTypeAnswerSerializer

    filterset_fields = {
        "id": ("exact",),
        "user": ("exact",),
    }

    def create(self, request, *args, **kwargs):
        record = models.UserExperienceTypeAnswer.objects.filter(
            user=request.data["user"], exp_type=request.data["exp_type"]
        ).first()

        if not record:
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
        else:
            record.answer = request.data["answer"]
            record.save()
            serializer = self.get_serializer(record)

        return Response(serializer.data, status=status.HTTP_201_CREATED)

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