【问题标题】:django API, "Incorrect type. Expected pk value, received str."django API,“类型不正确。预期的 pk 值,已收到 str。”
【发布时间】:2021-09-06 22:55:41
【问题描述】:

我的模型

class City(models.Model):
    city_name = models.CharField(max_length=40)

    def __str__(self):
        return self.city_name


class Place(models.Model):
    place_city = models.ForeignKey(City, on_delete=models.CASCADE)
    place_name = models.TextField(max_length=40)
    place_available_slots = models.IntegerField(default=None, blank=True, null=True)

    def __str__(self):
        return "%s - %s" % (self.place_city, self.place_name)

我的序列化器

class PlaceUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Place
        fields = '__all__'

我的观点:

class PlaceUpdateAPI(APIView):

    def put(self, request):
        place = Place.objects.get(place_name=request.data.get("place_name"))
        serializer = PlaceUpdateSerializer(place, request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)

错误是:

{
    "place_city": [
        "Incorrect type. Expected pk value, received str."
    ]
}

我尝试输入数据,但出现了错误。 place_city 是一个外键,有人可以指导我如何通过 API 将数据放入外键中。

【问题讨论】:

  • 您正在尝试传递城市名称 (str),但 place_city 是外键 (int)。如果Place 正在更改城市,您通常不想修改City 本身,而是指定一个不同的,您可以通过传递City 的ID 来完成这项工作。据我所知,您不能以这种方式更新 OneToOne 相关模型,但应该例如place.place_city.name=new_name 然后place.place_city.save()。如何确定 new_name 取决于 API 的使用情况,它可能是不同的端点。
  • 感谢您的帮助
  • @EdoardoFacchinelli 这似乎是一个答案,考虑将其作为答案而不是评论发布

标签: django api django-rest-framework


【解决方案1】:

您正在尝试传递城市名称 (str),但 place_city 是外键 (int)。 如果Place 正在更改城市,您通常不想修改City 本身,而是指定一个不同的,您可以通过传递另一个现有的City.id 来完成这项工作。

如果您确实需要更新 City 数据,据我所知,您不能以这种方式更新 OneToOne 相关模型,但应该例如

place.place_city.name=new_name
place.place_city.save()

如何确定new_name 取决于 API 的使用情况,它可能是不同的端点。

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2020-09-09
    • 1970-01-01
    • 2018-10-05
    • 2021-10-11
    • 2021-05-17
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多