Django как условно обновить значение поля на основе другого поля, связанного с ним внешним ключом?

У меня есть модель Test, в которой есть несколько skillareas (каждый тест может иметь несколько skillarea: от одного до многих) и каждый skillarea имеет несколько queastions в нем (каждый skillarea может иметь несколько вопросов: от многих до многих) Я хочу написать сериализатор обновления для теста, но поле "тип" в модели теста может быть изменено только если в области навыков этого теста не зарегистрировано ни одного вопроса. как я могу установить это условие для обновления?

MODELS.PY :


class Test(BaseModel):

    company = models.ForeignKey(
        'company.Company',
        on_delete=models.PROTECT,
        related_name='tests',
        null=True,
        blank=True,
    )
    types = models.ManyToManyField(
        TestType,
        related_name='tests',
    )
    title = models.CharField(max_length=255)
    summary = models.TextField()


    def __str__(self):
        return self.title
class SkillArea(BaseModel):
    title = models.CharField(max_length=255)
    test = models.ForeignKey('Test', on_delete=models.PROTECT, related_name='skill_areas')
    questions = models.ManyToManyField(
        'assessment.Question',
        related_name='skill_areas',
    )

    def __str__(self):
        return self.title


class Question(BaseModel):
   
    question_text = models.TextField()

    def get_absolute_url(self):
        self.get_type_display()

    def __str__(self):
        return truncatewords(self.question_text, 7)

class TestType(BaseModel):
    title = models.CharField(max_length=255)

    def __str__(self):
        return self.title

Сериализатор, который я написал, приведен ниже, но я не знаю, как сделать условие для обновления поля типа на основе отсутствия вопроса, зарегистрированного в связанной области навыков

serializer.py :

class TestAPIViewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Test
        fields = (

            'id',
            'level',
            'language',
            'types',
            'title',
            'summary',
            'relevant_for',
            'expectations',
            'status',
            'duration',
        )

Views.py :

class TestUpdateAPIView(APIView):

    def patch(self, request, pk):
        test = Test.active_objects.get(pk=pk)
        serializer = TestAPIViewSerializer(instance=test, partial=True, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.data, status= status.HTTP_400_BAD_REQUEST)
Вернуться на верх