我应该在序列化程序上重写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/