在Django REST Framework中,有一种简单的方法可以使用可空的ForeignKeys和序列化器吗?我一直在遇到问题(主要是在我的测试中),我将序列化一个具有可空外键的模型,将数据发送回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的序列化器,因此看起来应该可行.有人遇到过这种情况么?这里的最佳做法是什么?
最佳答案 我假设这与尚未与已保存的Publisher实例关联的书籍实例有关.我希望如果您实际创建了一个已保存的已发布实例并将其与该书籍实例相关联,那么它将按预期工作.
还要注意序列化不会执行验证,只有反序列化会这样做,所以serializer.data仍然会愉快地返回一个序列化的实例.顺便提一下,示例代码中serializer.data的值是多少?
编辑:哦对不起,我可能是愚蠢的 – 毕竟它是一个可以入侵的FK.同样的问题,那么……示例代码中serializer.data的价值是什么?
在django-rest-framework repo:https://github.com/tomchristie/django-rest-framework/issues/1303上链接到此票证