在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的序列化程序。有人遇到过这种情况么?这里的最佳做法是什么?
答案 0 :(得分:2)
我认为这与书籍实例尚未与已保存的Publisher
实例相关联。我希望如果您实际创建了一个已保存的已发布实例并将其与该图书实例相关联,那么它将按预期工作。
另请注意,序列化不会执行验证,只有反序列化会这样做,因此serializer.data
仍然会愉快地返回序列化实例。顺便提一下,示例代码中serializer.data
的值是多少?
编辑:哦对不起,我可能是愚蠢的 - 毕竟它是可以为空的 FK。同样的问题仍然存在,那么......示例代码中serializer.data
的价值是多少?
在django-rest-framework
repo:https://github.com/tomchristie/django-rest-framework/issues/1303