У меня есть простые модели EmployeeSkill и Skill:
class EmployeeSkill(models.Model):
# this is required
employee = models.ForeignKey(
Employee, on_delete=models.CASCADE
)
# this is required
skill = models.ForeignKey(
Skill, on_delete=models.CASCADE
)
def skill_name(self):
return self.skill.name
class Skill(models.Model):
# this is required
name = models.CharField(max_length=255, unique=True)
Я хочу сохранить атрибут навыка EmployeeSkill, необходимый для модели, но я хочу включить передачу только имени навыка в сериализаторе, что получить или создать соответствующий навык. Вот мой сериализатор:
class EmployeeSkillSerializer(serializers.ModelSerializer):
class Meta:
fields = (
"id",
"employee",
"skill",
"skill_name",
)
model = EmployeeSkill
extra_kwargs = {
"skill": {"required": False},
}
def validate_skill(self, value):
""" custom validator for skill. skill can be empty if skill_name is valid """
if value is None:
skill_name = getattr(self, "skill_name", None)
if not (skill_name and type(skill_name) is str):
raise serializers.ValidationError(
"if no skill is provided, skill_name should be a valid string"
)
elif not type(value) is Skill:
raise serializers.ValidationError("skill must be of type Skill or None")
return value
def create(self, validated_data):
if (not self.skill) and self.skill_name:
validated_data["skill"] = Skill.objects.get_or_create(skill_name=self.skill_name)[0]
super().create(validated_data)
Проблема в том, что я все еще получаю сообщение об ошибке:
{
"skill": [
"This field may not be null."
],
}
Есть идеи о том, как я могу решить мою проблему?