Django rest framework 如何使ForeignKey在DRF中不使用任何设备的情况下发挥出色?
在Django REST框架中,有没有一种简单的方法可以使用可为空的外键和序列化程序?我一直遇到一些问题(主要是在我的测试中),我将序列化一个具有可为空外键的模型,将数据发送回DRF,然后得到错误“类型不正确”。预期pk值,收到str.' 例如: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
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的字段不会改变任何事情