2017-07-06 68 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,今天就要去了 –