首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖验证程序django DRF中的必需字段

覆盖验证程序django DRF中的必需字段
EN

Stack Overflow用户
提问于 2020-04-03 05:39:21
回答 1查看 606关注 0票数 0

我有简单的EmployeeSkill和技能模型:

代码语言:javascript
复制
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技能属性,但我希望只允许在序列化程序中传递一个技能名,这将获得或创建适当的技能。这是我的序列化程序:

代码语言:javascript
复制
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)

问题是,我仍然有一个错误:

代码语言:javascript
复制
{
    "skill": [
        "This field may not be null."
    ],
}

知道我该怎么解决我的问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-03 06:52:52

我稍微改变了创建函数。还将skill_name字段添加到序列化程序中。

代码语言:javascript
复制
from rest_framework import serializers
from webtest.models import EmployeeSkill, Skill


class EmployeeSkillSerializer(serializers.ModelSerializer):
    skill_name = serializers.CharField()

    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 validated_data.get('skill') and validated_data.get('skill_name'):
            validated_data["skill"] = Skill.objects.get_or_create(name=validated_data['skill_name'])[0]
        if 'skill_name' in validated_data:
            del validated_data['skill_name']
        return super().create(validated_data)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61005679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档