Django и DRF - проверка наличия ограничений перед ID

В моем проекте Django я использую DRF. Одна из моих моделей, Type, имеет ограничение; поле name должно быть уникальным. Другая модель, Project, имеет отношение к Type; проект всегда имеет тип.

Сериализатор для Project имеет еще одно отношение, которое я хотел бы вписать. Для этого ProjectSerializer реализует WritableNestedModelSerializer из этого пакета .

Вот в чем проблема: при создании нового Project не следует также (иметь возможность) одновременно создавать новый Type. Однако, похоже, что Django проверяет, разрешено ли это. Это приводит к ошибке, потому что при отправке объекта Project в POST, он проверяет, разрешено ли создание данного объекта Type, прежде чем проверить, содержит ли он поле ID, что указывает на использование уже существующего типа. Из-за этого я получаю ошибку, в которой говорится, что поле name для Type уже существует, и я не могу создать новый проект. Как мне указать, что это не то, что я хочу? Я могу просто снять ограничение на поле name в Type, но я вроде как хочу, чтобы оно там было.

Вот соответствующий код:

class ProjectType(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50, unique=True)
    is_active = models.BooleanField(default=True)


class Project(models.Model):
    id = models.AutoField(primary_key=True)
    type = models.ForeignKey(ProjectType, related_name='projects', on_delete=models.SET_NULL, null=True)
    project_coordinator = models.ForeignKey('employee.Emplotee', on_delete=models.SET_NULL, null=True,
                                            related_name='projects_coordinated')


class ProjectTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProjectType
        fields = [
            'id',
            'name',
            'is_active',
        ]


class ProjectSerializer(WritableNestedModelSerializer):
    project_coordinator = SimpleEmployeeField(many=False, required=False, allow_null=True)
    type = ProjectTypeSerializer(many=False)

    class Meta:
        model = Project
        fields = [
            'id',
            'project_coordinator',
            'type',
        ]

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        ret = OrderedDict(filter(lambda x: x[1] is not None, ret.items()))
        return ret
Вернуться на верх