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]