我正在尝试在 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...
所以我正在尝试创建一个序列化程序,它向我显示另一个模型的整个对象,该模型通过外键链接到我正在使用我的 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...