2016-12-06 25 views
2

シリアライザのcreate()メソッドをオーバーライドするはずですが、DRFがvalidate_data.get('some_field', None)の実際の値を取得できない理由を理解できません。validated_data.get()の値が正しく取得されていません

私のモデルです。

class Heat(models.Model): 

    # Fields 
    performer = models.CharField(max_length=25) 
    is_bred = models.BooleanField(default=False) 
    note = models.TextField(max_length=250, blank=True, null=True) 

class Breeding(models.Model): 

    # Relationship Fields 
    heat = models.OneToOneField(
     Heat, 
     on_delete=models.CASCADE) 

    # Fields 
    performer = models.CharField(max_length=25) 
    remarks = models.TextField(max_length=255, blank=True, null=True) 

そしてここでは、ここに私のvalidated_dataがあるように見える私のシリアライザクラス

class BreedingSerializer(serializers.ModelSerializer): 

    def create(self, validated_data): 
     heat_id = validated_data.get('heat', None) 
     heat = Heat.objects.get(pk=heat_id) 

     breeding = Breeding.objects.create(**validated_data) 

     return breeding 

    class Meta: 
     model = Breeding 
     fields = ['id', 'heat', 'performer', 'remarks'] 

です。

{ 
    "heat": 1, 
    "performer": "Some person", 
    "remarks": "testing" 
} 

私はそれが熱整数1として提供'Heat Object'ない実データとしての値を得heat_idを印刷しよう。このコードではうまく動作しますbreeding = Breeding.objects.create(**validated_data)

誰でも説明できますか?

答えて

2

あなたが印刷したdictが実際にはvalidated_dataであることを正直に疑う。シリアライザに送信された生データによく似ています。 heat以来

の関係で、DRFのModelSerializerは自動的理由Breeding.objects.create(**validated_data)作品ですこと、また、PK = 1でオブジェクトをインスタンス化します。 Breeding.objects.create(heat=1)のようなものを試した場合、heatキーワードがPKではなくオブジェクトであると予想されるため、Djangoはおそらく文句を言うでしょう。

+0

返答いただきありがとうございますが、どうやってこれを元気にすることができますか?または熱を実際の値にするために可能な方法は何ですか? –

+0

'validated_data ['heat']'は既にあなたに必要なオブジェクトを与えていますので、単に 'create'メソッドの最初の行を取り除くことができます。オブジェクトのPKを別のものにしたいのであれば、 'validated_data ['heat'] .pk'を実行するだけです。 – lucasnadalutti

+0

あなたは私の時間を救う!答えをありがとう!そして私は今、明らかに理解しています。 –

関連する問題