没有正确获得validated_data.get()值

时间:2016-12-06 19:05:49

标签: python django django-rest-framework

我应该覆盖序列化程序上的create()方法,但我无法理解为什么DRF无法获得validate_data.get('some_field', None)的真正价值。

这是我的模特。

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)

这是我的序列化程序类

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']

这是我的validated_data看起来像。

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

当我尝试打印heat_id时,它产生的值为'Heat Object'而不是以热整数1提供的实际数据。但它在此代码breeding = Breeding.objects.create(**validated_data)中运行良好。

任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

老实说,我怀疑你打印的dict实际上是validated_data。它看起来更像是发送到序列化程序的原始数据。

由于heat是一种关系,DRF的ModelSerializer会自动实例化PK = 1的对象。此外, Breeding.objects.create(**validated_data)工作的原因。如果您尝试了类似Breeding.objects.create(heat=1)的内容,Django可能会抱怨,因为它不希望heat关键字成为PK,而是相反的对象。