Django rest framework 如何使ForeignKey在DRF中不使用任何设备的情况下发挥出色?

Django rest framework 如何使ForeignKey在DRF中不使用任何设备的情况下发挥出色?,django-rest-framework,Django Rest Framework,在Django REST框架中,有没有一种简单的方法可以使用可为空的外键和序列化程序?我一直遇到一些问题(主要是在我的测试中),我将序列化一个具有可为空外键的模型,将数据发送回DRF,然后得到错误“类型不正确”。预期pk值,收到str.' 例如: class Book(models.Model): publisher = models.ForeignKey(Publisher, null=True, blank=True) class BookSerializer(serializer

在Django REST框架中,有没有一种简单的方法可以使用可为空的外键和序列化程序?我一直遇到一些问题(主要是在我的测试中),我将序列化一个具有可为空外键的模型,将数据发送回DRF,然后得到错误“类型不正确”。预期pk值,收到str.'

例如:

class Book(models.Model):
    publisher = models.ForeignKey(Publisher, null=True, blank=True)

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book

class BookViewSet(viewsets.ViewSet):
    model = Book
    serializer_class = BookSerializer
以及通常的URL、路由等实现

然后,在shell中:

>>> from django.test.client import Client
>>> client = Client()
>>> book = Book()
>>> serializer = BookSerializer(book)
>>> response = client.post('/books/', serializer.data)
>>> response.data
{'publisher': ['Incorrect type.  Expected pk value, received str.']}

似乎这样应该可以,因为发布的数据直接来自DRF的序列化程序。还有其他人遇到过这种情况吗?这里的最佳实践是什么?

我假设这与图书实例尚未与保存的
发行商
实例关联有关。我希望,如果您实际创建了一个已保存的已发布实例并将其与book实例关联,那么它将按预期工作

还要注意,序列化不会执行验证,只有反序列化才能执行验证,因此,
serializer.data
仍将愉快地返回序列化实例。顺便问一下,在示例代码中,
serializer.data
的值是多少

编辑:哦,对不起,我可能有点傻——毕竟这是一个可为空的FK。同样的问题,那么。。。在示例代码中,
serializer.data
的值是多少


链接到django rest framework上的此票据repo:

嗨,Tom,这在对现有记录的put请求中也会失败(我认为这间接回答了您的问题)。我在GH上打开了第1303期,并提供了一些详细信息。如果在序列化程序上显式定义required=False的字段,会发生什么情况?显式定义required=False的字段不会改变任何事情