2017-07-06 62 views
0

我有一个Django 1.10项目,这样的模式:字段级验证 - 检查该字段值确实有效

class Student(models.Model): 
    #... 
    university = models.ForeignKey(University, ...) 

...和串行器中,我想执行检查像这样(我提供了一个伪代码,因为我有不知道如何编写本地Django的代码):

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

    def validate_student(self, value): 
     if invalid_value_is_provided_for_student: 
      value = 666 
     return value 

而且最重要的是,我想如果一个特定的值重新分配到外地已经提供了无效值(在上面的例子中,我给它分配了666)。 一种方式做到这一点,我想到的是:

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

...这似乎是有点脏。我有一种感觉,Django使用异常处理来实现本地更优雅的方式。有任何想法吗?

+0

你可以写一个自定义的管理器方法。 –

+0

或者'尝试:除了:' –

回答

4

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

models.py

class Student(models.Model): 
    #... 
    university = models.ForeignKey(University, ...) 

serializers.py

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

离开验证部分serializers.ModelSerializer。什么heapens这里是ModelSerializer创建您的串行内university属性像
university = PrimaryKeyRelatedField(queryset=University.objects.all()) 这足以验证

基于注释

对于要求更新#2,你必须重写大学场在StudentSerializer类中。然后你必须在创建方法上实现模型链接。

models.py

class Student(models.Model): 
    #... 
    university = models.ForeignKey(University, ...) 

serializers.py

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) 

希望这将解决您的问题

+0

我没有明白你的意思。问题是,在客户(如移动应用程序)为大学提供无效价值的情况下,如何分配具体的价值(例如,666)。 –

+0

答案已更新(** UPDATE#2 **) –

+0

Aneesh,今天就要去了 –