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)