Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何发布一对一关系外键数据_Django_Django Rest Framework - Fatal编程技术网

Django 如何发布一对一关系外键数据

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

这是我试图用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 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)