gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:03:57 25 4
gpt4 key购买 nike

我有两个模型,第一个作为父模型“Country”,在第二个模型之前填充为子模型“City”。如下

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

我的 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)

现在,当我运行 get api 时,它会运行并给我一个很好的结果。但是当我试图创建一个新城市并在 json 中设置“国家”:“id”时,我得到了这个错误

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

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

请任何人提供解决方案帮助,因为我尝试了很多方法并阅读了关于这一点的 django rest 框架文档,但我没有得到它。

最佳答案

首先,raise_exception应该是一个 bool 值(TrueFalse)

您可以通过使用从 ListCreateAPIView 继承 View 类来避免此错误


<b>from rest_framework.generics import ListCreateAPIView</b><p></p>

<p>class CityAPIView(<b>ListCreateAPIView</b>):
queryset = City.objects.all()
serializer_class = CitySerializer
permission_classes = [AllowAny, AllowAnonymous]</p>
如果您正在使用 ListCreateAPIView,您不想使用 post() 方法,因为 DRF 会很好地处理这部分。

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

关于python - 当父记录存在时,如何在 django rest 框架中的子序列化程序中设置外键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52486899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com