Django 如何发布一对一关系外键数据
这是我试图用rest_框架保存的当前模型Django 如何发布一对一关系外键数据,django,django-rest-framework,Django,Django Rest Framework,这是我试图用rest_框架保存的当前模型 class ModelA(models.Model): model_b = models.OneToOneField(ModelB, on_delete=models.CASCADE) some_integer_field = models.IntegerField() class ModelB(models.Model): data = models.TextField() 我的序列化程序: class ModelASer
class ModelA(models.Model):
model_b = models.OneToOneField(ModelB, on_delete=models.CASCADE)
some_integer_field = models.IntegerField()
class ModelB(models.Model):
data = models.TextField()
我的序列化程序:
class ModelASerializer(serializers.ModelSerializer):
class Meta:
model = ModelA
fields = ('id', 'some_integer_field', 'model_b')
class ModelBSerializer(serializers.ModelSerializer):
class Meta:
model = ModelB
fields = ('id', 'data')
我试图实现的是,当我发布ModelA时:
{
"some_integer_field": 123,
"model_b" : "123,123,123,432,432"
}
我希望在数据库中创建ModelB时,填充数据字段,然后ModelA将使用ModelB的pk来创建自己。数据不可为空。它必须在那里。给定以下模型
class ModelA(models.Model):
model_b = models.OneToOneField(ModelB, on_delete=models.CASCADE)
some_integer_field = models.IntegerField()
class ModelB(models.Model):
data = models.TextField()
像这样覆盖并实现序列化程序
class ModelBSerializer(serializers.ModelSerializer):
class Meta:
model = ModelB
fields = ('data')
class ModelA(serializers.ModelSerializer):
model_b = ModelBSerializer()
class Meta:
model = ModelA
fields = ('__all__')
def create(self, validated_data):
model_b_validated_data = validated_data.pop('modelB') // given you have model b key value provided in your http POST payload
modelB = ModelB.create(**model_b_validated_data)
modelA = ModelA.create(**validated_data)
return modelA
某些部分可能会因您试图完成的任务而有所不同。但实际上,您需要指定嵌套序列化程序,并为具有该关系的模型重写create方法。此实现django rest调用可写嵌套序列化程序。请参阅提供的链接,它可以通过覆盖序列化程序的create方法来完成,如下所示:
另外,添加这一行model_b=serializers.CharField,因为默认情况下model_b期望一个model b的主键Hmm我不理解你答案中的一点model_b=model_a这部分令人难以置信。
class ModelASerializer(serializers.ModelSerializer):
model_b = serializers.CharField()
class Meta:
model = ModelA
fields = ('id', 'some_integer_field', 'model_b')
def create(self, validated_data):
data_of_model_b = validated_data.pop('model_b')
model_b_object, created = ModelB.objects.get_or_create(data=data_of_model_b)
return ModelA.objects.create(**validated_data, model_b=model_b_object)