Django REST中的字段级验证-检查字段值是否实际有效

Django REST中的字段级验证-检查字段值是否实际有效,django,django-rest-framework,Django,Django Rest Framework,我有一个Django 1.10项目和这样的模型: class Student(models.Model): #... university = models.ForeignKey(University, ...) …还有一个序列化程序,我想在其中执行如下检查(我提供了一个伪代码,因为我不知道如何编写本机Django代码): 最重要的是,如果提供了无效值,我想为字段重新分配一个特定值(在上面的示例中,我为其分配666)。 我想到的一种方法是: def validate_st

我有一个Django 1.10项目和这样的模型:

class Student(models.Model):
    #...
    university = models.ForeignKey(University, ...)
…还有一个序列化程序,我想在其中执行如下检查(我提供了一个伪代码,因为我不知道如何编写本机Django代码):

最重要的是,如果提供了无效值,我想为字段重新分配一个特定值(在上面的示例中,我为其分配666)。 我想到的一种方法是:

   def validate_student(self, value):
        if value not in University.objects.values('id'):
            value = 666
        return value

…看起来有点脏。我有一种感觉,Django有一种本机的更优雅的方法,可以使用异常处理来实现这一点。有什么想法吗

您不必为此编写任何额外的代码,因为您是通过扩展
ModelSerializer
来创建序列化程序的。因此,序列化程序包含restframework提供的默认大学验证字段。删除验证程序,并尝试添加一些具有现有和不存在大学id字段的学生

models.py

class Student(models.Model):
    #...
    university = models.ForeignKey(University, ...)
class Student(models.Model):
    #...
    university = models.ForeignKey(University, ...)
序列化程序.py

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = '__all__'
class StudentSerializer(serializers.ModelSerializer):

    university = serializers.IntegerField()

    class Meta:
        model = Student
        fields = '__all__'

    def create(self, validated_data):
        university_id = validated_data.pop('university')
        try:
            university = University.objects.get(id=university)
        except University.DoesNotExist:
            # default 
            university = University.objects.get(id=666)
        return Student.objects.create(university=university, **validated_data) 
将验证部分留给
序列化程序。ModelSerializer
。这里发生的是ModelSerializer在序列化程序中创建
大学
属性,如
university=PrimaryKeyRelatedField(queryset=university.objects.all())
哪一项足以进行验证

根据评论更新#2

对于该要求,必须重写StudentSerializer类中的university字段。然后,您必须在create方法上实现模型链接

models.py

class Student(models.Model):
    #...
    university = models.ForeignKey(University, ...)
class Student(models.Model):
    #...
    university = models.ForeignKey(University, ...)
序列化程序.py

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = '__all__'
class StudentSerializer(serializers.ModelSerializer):

    university = serializers.IntegerField()

    class Meta:
        model = Student
        fields = '__all__'

    def create(self, validated_data):
        university_id = validated_data.pop('university')
        try:
            university = University.objects.get(id=university)
        except University.DoesNotExist:
            # default 
            university = University.objects.get(id=666)
        return Student.objects.create(university=university, **validated_data) 

希望这能解决您的问题

您不必为此编写任何额外的代码,因为您是通过扩展
ModelSerializer
来创建序列化程序的。因此,序列化程序包含restframework提供的默认大学验证字段。删除验证程序,并尝试添加一些具有现有和不存在大学id字段的学生

models.py

class Student(models.Model):
    #...
    university = models.ForeignKey(University, ...)
class Student(models.Model):
    #...
    university = models.ForeignKey(University, ...)
序列化程序.py

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = '__all__'
class StudentSerializer(serializers.ModelSerializer):

    university = serializers.IntegerField()

    class Meta:
        model = Student
        fields = '__all__'

    def create(self, validated_data):
        university_id = validated_data.pop('university')
        try:
            university = University.objects.get(id=university)
        except University.DoesNotExist:
            # default 
            university = University.objects.get(id=666)
        return Student.objects.create(university=university, **validated_data) 
将验证部分留给
序列化程序。ModelSerializer
。这里发生的是ModelSerializer在序列化程序中创建
大学
属性,如
university=PrimaryKeyRelatedField(queryset=university.objects.all())
哪一项足以进行验证

根据评论更新#2

对于该要求,必须重写StudentSerializer类中的university字段。然后,您必须在create方法上实现模型链接

models.py

class Student(models.Model):
    #...
    university = models.ForeignKey(University, ...)
class Student(models.Model):
    #...
    university = models.ForeignKey(University, ...)
序列化程序.py

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = '__all__'
class StudentSerializer(serializers.ModelSerializer):

    university = serializers.IntegerField()

    class Meta:
        model = Student
        fields = '__all__'

    def create(self, validated_data):
        university_id = validated_data.pop('university')
        try:
            university = University.objects.get(id=university)
        except University.DoesNotExist:
            # default 
            university = University.objects.get(id=666)
        return Student.objects.create(university=university, **validated_data) 

希望这能解决您的问题。

您可以编写一个自定义管理器方法。尝试:例外:您可以编写一个自定义管理器方法。尝试:例外:我不明白您的意思。问题是,当客户端(比如,移动应用程序)为大学提供无效值时,我如何分配特定值(例如666)。Aneesh,今天就要开始了。我不明白你的意思。问题是,当客户端(比如移动应用程序)为university.Aneesh提供无效值时,我如何分配特定值(例如666)呢