2017-07-06 4 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

または '試してください:except:' –

答えて

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 = PrimaryKeyRelatedField(queryset=University.objects.all()) のようなあなたのシリアライザ内部university属性を作成します

その要件についてはコメント

に基づいてUPDATE#2、あなたは大学のフィールドを無効にする必要がありますStudentSerializerクラスにあります。次に、createメソッドでモデルのリンクを実装する必要があります。

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

答えが更新されました(**更新#2 **) –

+0

Aneesh、今日は行くでしょう –

関連する問題