Я пишу API для следующих моделей:
class TemplateProjectGroup(models.Model):
pass
class TemplateProject(models.Model):
name = models.CharField(max_length=255, unique=True)
description = models.CharField(max_length=1024, blank=True)
group = models.ForeignKey(TemplateProjectGroup, on_delete=models.CASCADE)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
avatar_url = models.URLField(max_length=1024, blank=True)
Логика следующая: пользователь может создать экземпляр TemplateProject
с несуществующим полем group
. Таким образом, если группа не существует, она должна быть создана с определенным идентификатором. Итак, у меня есть этот сериализатор:
class TemplateProjectSerializer(serializers.ModelSerializer):
def create(self, validated_data):
template_project_group_id = validated_data.pop('group')
project = validated_data.pop('project')
group, _ = models.TemplateProjectGroup.objects.get_or_create(id=template_project_group_id)
template_project = models.TemplateProject.objects.create(**validated_data, group_id=group.id, project_id=project.id)
return template_project
def update(self, instance, validated_data):
template_project_group_id = validated_data.pop('group')
group, _ = models.TemplateProjectGroup.objects.get_or_create(id=template_project_group_id)
instance.save()
instance.update(**validated_data, group=group)
return instance
class Meta:
model = models.TemplateProject
fields = ('name', 'description', 'group', 'project', 'avatar_url')
и вид:
class TemplateProjectsView(generics.ListCreateAPIView):
pagination_class = None
serializer_class = serializers.TemplateProjectSerializer
def get_queryset(self):
return models.TemplateProject.objects.all()
Хорошо работает, когда я пытаюсь получить список объектов, но я не могу создать объект с помощью этого API, потому что я получаю следующую ошибку:
Invalid pk "1" - object does not exist.
Таким образом, перед созданием объекта применяется проверка для всех полей, и сериализатор не может сериализовать это целое число в объект, поскольку этот объект, на который ссылается внешний ключ, не существует. Я написал метод validate_group(self, value)
, но исключение возникает до того, как точка выполнения прибывает в этот метод. Более близким моментом, который я мог бы поставить в отладчике, является метод is_valid(self, raise_exception=False)
. Я мог бы создавать отсутствующие объекты там, но я думаю, что это было бы плохой практикой, потому что этот метод на самом деле не имеет целью проверку или подготовку данных.
Как правильно создать объект, прежде чем он пройдет все проверки?