django - “不正确的类型。预期的pk值,收到str”错误

时间:2015-06-10 18:27:08

标签: django serialization foreign-keys django-rest-framework

我的django-rest-framework我有以下模型:

基本上每次乘车都有一个最终目的地,并且可以有多个中间目的地。

models.py:

class Destination(models.Model):
    name=models.CharField(max_length=30)

class Ride(models.Model):
    driver = models.ForeignKey('auth.User', related_name='rides_as_driver')
    destination=models.ForeignKey(Destination, related_name='rides_as_final_destination')
    leaving_time=models.TimeField()
    num_of_spots=models.IntegerField()
    passengers=models.ManyToManyField('auth.User', related_name="rides_as_passenger")
    mid_destinations=models.ManyToManyField(Destination, related_name='rides_as_middle_destination')

serializers.py - RideSerializer

class RideSerializer(serializers.ModelSerializer):
    driver = serializers.ReadOnlyField(source='driver.user.username')

    class Meta:
        model = Ride
        fields = ('driver', 'destination', 'leaving_time',
                  'num_of_spots', 'passengers', 'mid_destinations')
        read_only_fields = ('driver', 'passengers', 'mid_destinations')

问题是 - 当我尝试POST到/ rides /以便添加游戏时 - 例如{destination=LA, leaving_time=19:45, num_of_spots=4}

我收到错误"destination":["Incorrect type. Expected pk value, received str."]}

几个问题:

  • 这是什么错误?如果我在 Ride 模型中将目的地作为外键,是否意味着我添加的目的地必须已经在目的地表中?

  • 如何解决此错误?

2 个答案:

答案 0 :(得分:7)

问题是您将相关name对象的Destination传递给序列化程序,而不是传递pk的{​​{1}} / id对象。因此,Django REST框架正在看到这一点并抱怨,因为它无法将Destination解析为对象。

听起来你实际上可能正在寻找a SlugRelatedField,它允许你通过slug(在这种情况下为LA)而不是主键来识别对象。

答案 1 :(得分:0)

Angular / Django Rest Framework

当尝试发布一个包含带有某些数组值的字段的formdata时,我遇到了类似的问题。原来,我在angular frontend的post标头中使用了错误的content-type。我只需要注释掉Content-Type。

  Post(endpoint, postData) {
    let auth = `Bearer ${this.token}`;
    let headers = new HttpHeaders({
      // "Content-Type": "application/x-www-form-urlencoded",
      Authorization: auth
    });
    let fullurl = `${this.baseUrl}${endpoint}`;
   .....
  ....
}