我正在尝试在 Django 中创建一个可写的嵌套序列化程序,但无法正确使用 post 方法

I am trying to create an writable nested serializer in django, but can't use post method properly

所以我正在尝试创建一个序列化程序,它向我显示另一个模型的整个对象,该模型通过外键链接到我正在使用我的 GET 的模型,但我只能 post通过创建一个新的国家而不是实际存在的国家, 所以这是我的两个模型,模型 1

class CountryName1(models.Model):
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

另一个模型,模型 2

class TeslaModel1(models.Model):
    model_name = models.CharField(max_length=30)
    price = models.IntegerField()
    origin = models.ForeignKey(CountryName1, on_delete=models.CASCADE, 
    related_name='teslamodels')

    def __str__(self):
        return self.model_name

我的序列化器是这样的

class CountryNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = CountryName1
        fields = ['name']


class TeslaModelSerializer(serializers.ModelSerializer):
    origin = CountryNameSerializer()

    class Meta:
        model = TeslaModel1
        fields = ['model_name', 'price', 'origin']

        def create(self, validated_data):
            origin_data = validated_data.pop('origin')
            country_model = CountryName1.objects.create(**origin_data)
            dataitem = TeslaModel1.objects.create(origin=country_model, 
            **validated_data)

            return dataitem

以下是我的观点:

class TeslaModelListCreateAPIView(ListCreateAPIView):
    queryset = TeslaModel1.objects.all()
    serializer_class = TeslaModelSerializer


class CountryNameListCreateAPIView(ListCreateAPIView):
    queryset = CountryName1.objects.all()
    serializer_class = CountryNameSerializer

就是这样,改一下就可以了TeslaModelSerializer

class TeslaModelSerializer(serializers.ModelSerializer):
    origin = CountryNameSerializer(many=True)

    class Meta:
        model = TeslaModel1
        fields = ['model_name', 'price', 'origin']

    def create(self, validated_data):
        origin_data = validated_data.pop('origin')
        tesla = TeslaModel1.objects.create(**validated_data)
        for data in origin_data:
            CountryName1.objects.create(**data)
        return tesla

查看此 docs 了解更多信息。

对于任何其他可能有相同问题的人, 这是我如何修复它 创建 2 个序列化器,一个用于 POST,一个用于 GET,而不仅仅是 TeslaModelSerializer

class TeslaModelReadSerializer(serializers.ModelSerializer):
    origin = SerializerMethodField()

    class Meta:
        model = TeslaModel1
        fields = ['model_name', 'price', 'origin']

    def get_origin(self, tesla_model):
        return CountryNameSerializer(tesla_model.origin).data

class TeslaModelWriteSerializer(serializers.ModelSerializer):


    class Meta:
        model = TeslaModel1
        fields = ['model_name', 'price', 'origin']

然后我们的观点就会变成这样

class TeslaModelListCreateAPIView(ListCreateAPIView):
    queryset = TeslaModel1.objects.all()
    read_serializer_class = TeslaModelReadSerializer
    write_serializer_class = TeslaModelWriteSerializer

    def get_serializer_class(self):
        if self.request.method == 'GET':
            return self.read_serializer_class
        return self.write_serializer_class

-这里我假设我们只有 POST 和 GET,但您可以根据需要修改视图以使用其他方法,如 DELETE、PUT...