django - "类型不正确.预期pk值,收到str"错误

Ofe*_*mon 5 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')
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

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

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

几个问题:

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

  • 如何解决这个错误?

Kev*_*own 7

问题是,你正在过name相关的Destination对象串行化,而不是传递pk/ id中的Destination对象.所以Django REST框架正在看到这个并抱怨,因为它无法解析LA成一个对象.

听起来你可能正在寻找一个SlugRelatedField,它允许你通过slug(LA在这种情况下)而不是他们的主键来识别对象.