Python 当父记录存在时,如何在django rest框架的子序列化程序中设置foreignkey值

Python 当父记录存在时,如何在django rest框架的子序列化程序中设置foreignkey值,python,django,python-3.x,django-rest-framework,postman,Python,Django,Python 3.x,Django Rest Framework,Postman,我有两个模型,第一个是家长模型“国家”,第二个是孩子模型“城市”。如下 class Country(models.Model): name = models.CharField(max_length=35) icon = models.ImageField() def __str__(self): return self.name class City(models.Model): name = models.CharField(max_le

我有两个模型,第一个是家长模型“国家”,第二个是孩子模型“城市”。如下

class Country(models.Model):
    name = models.CharField(max_length=35)
    icon = models.ImageField()

    def __str__(self):
        return self.name


class City(models.Model):
    name = models.CharField(max_length=35)
    country = models.ForeignKey(to=Country, on_delete=models.CASCADE)

    def __str__(self):
        return self.name
My serializers.py可满足以下需求:

class CountrySerializer(ModelSerializer):
    class Meta:

        model = Country
        fields = '__all__'

class CitySerializer(ModelSerializer):
    country = serializers.PrimaryKeyRelatedField(queryset=Country.objects.all())

    class Meta:

        model = City
        fields = ('name', 'country')
view.py

class CountryAPIView(ListAPIView):
    queryset = Country.objects.all()
    serializer_class = CountrySerializer
    permission_classes = [AllowAny, AllowAnonymous]


class CityAPIView(ListAPIView):
    queryset = City.objects.all()
    serializer_class = CitySerializer
    permission_classes = [AllowAny, AllowAnonymous]

    def post(self, request):

        serializer = CitySerializer(data=request.data)
        if serializer.is_valid(raise_exception=ValueError):
            serializer.create(validated_data=request.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages,
                        status=status.HTTP_400_BAD_REQUEST)
现在,当我运行GetAPI时,它会运行并给出一个很好的结果。但当我试图创建一个新城市并设置“country”:“id”在json中时,我遇到了这个错误

无法分配“2”:“City.country”必须是“country”实例

所以,如果我不清楚,我需要的是在创建城市时将外键精确设置为city,而不是创建city和country


请任何人都有解决方案帮助,因为我尝试了许多方法并阅读了django rest framework文档,但我没有得到它。

您没有使用验证数据创建新城市,只需更改这一行:

        serializer.create(validated_data=request.data)
为此:

        serializer.save()
执行
serializer.save()
时,序列化程序将使用其已验证的数据

此外,DRF还有一个通用视图(),它涵盖了您的用例。

首先,应该是一个布尔值(True或False)

通过使用从继承视图类,可以避免此错误

从rest_framework.generics导入ListCreateAPIView

类别CityAPIView(ListCreateAPIView): queryset=City.objects.all() 序列化程序\u类=城市序列化程序 权限\u类=[AllowAny,allowanyous]
如果使用的是
ListCreateAPIView
,则不希望使用
post()
方法,因为DRF会很好地处理该部分

建议

由于您正在处理模型的CRUD功能,您可以使用DRF的类

您能看到这个问题吗,非常感谢@JPG

from rest_framework.generics import ListCreateAPIView

class CityAPIView(ListCreateAPIView): queryset = City.objects.all() serializer_class = CitySerializer permission_classes = [AllowAny, AllowAnonymous]