我应该在序列化程序上重写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)中效果很好。

谁能解释?

最佳答案

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

由于heat是关系,因此DRF的ModelSerializer自动以PK = 1实例化对象。这就是Breeding.objects.create(**validated_data)起作用的原因。如果您尝试使用类似Breeding.objects.create(heat=1)的方法,则Django可能会抱怨,因为它不希望heat关键字是PK,而是对象。

关于python - 无法正确获取validated_data.get()值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41002934/

10-12 22:00