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