我应该覆盖序列化程序上的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)
中运行良好。
任何人都可以解释一下吗?
答案 0 :(得分:2)
老实说,我怀疑你打印的dict
实际上是validated_data
。它看起来更像是发送到序列化程序的原始数据。
由于heat
是一种关系,DRF的ModelSerializer
会自动实例化PK = 1的对象。此外, 是Breeding.objects.create(**validated_data)
工作的原因。如果您尝试了类似Breeding.objects.create(heat=1)
的内容,Django可能会抱怨,因为它不希望heat
关键字成为PK,而是相反的对象。