Django REST中的字段级验证-检查字段值是否实际有效
我有一个Django 1.10项目和这样的模型: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
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)呢