【发布时间】:2020-09-09 18:36:51
【问题描述】:
我有一个ModelSerializer,我用它来创建新帖子。它有一个字段book,类型为PrimaryKeyRelatedField(queryset=Book.objects.all(), pk_field=serializers.CharField(max_length=255))。
当我发布到此端点时,我收到错误:
{
"book": ["Incorrect type. Expected pk value, received str."]
}
这怎么可能,因为我的主键是 CharField。
真正让我失望的是,我尝试用SlugRelatedField 绕过这个问题,但是当我这样做时,我得到了一个非常长而且奇怪的错误:
DataError at /api/content/posts/
value "9780241470466" is out of range for type integer
LINE 1: ...020-05-22T20:14:17.615205+00:00'::timestamptz, 1, '978024147...,我完全看不懂,因为我没有设置整数。
序列化代码:
class PostCreationSerializer(serializers.ModelSerializer):
book = serializers.PrimaryKeyRelatedField(queryset=Book.objects.all(), pk_field=serializers.CharField(max_length=255))
class Meta:
model = Post
fields = ['content', 'book', 'page', 'date_posted', 'user', 'id']
read_only_fields = ['date_posted', 'user', 'id']
型号代码:
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
pages = models.PositiveSmallIntegerField(null=True, blank=True)
image = models.URLField(null=True, blank=True)
date_published = models.CharField(max_length=4, null=True, blank=True)
publisher = models.CharField(max_length=140, null=True, blank=True)
isbn13 = models.CharField(max_length=13, primary_key=True)
objects = AutomaticISBNDBManager
def __str__(self):
return self.title
查看代码:
class PostListCreate(UseAuthenticatedUserMixin, generics.ListCreateAPIView):
serializer_class = PostSerializer
queryset = Post.objects.order_by('-date_posted')
def get_serializer_class(self):
if self.request.method == 'POST':
return PostCreationSerializer
else:
return PostSerializer
编辑:我发送的 POST:
{
"book": "9780241470466",
"content": "test",
"page": "10"
}
注意:user 和 date_posted 是自动设置的。
【问题讨论】:
-
您能分享您的发帖数据吗?您是否使用
id字段作为主键? -
@kamilyrb isbn13 是主键。我将使用我发布的数据编辑问题
-
您是否覆盖了
AutomaticISBNDBManager中的任何方法?无法使用默认管理器重现此错误。 -
@drec4s 是的,我已经覆盖了 get() 方法。它尝试使用普通的 get 方法,如果失败,它会创建一本新书并返回它。
-
@drec4s 虽然对我来说自定义和标准管理器都会发生这种情况。也许是因为 Postgres。
标签: python django postgresql django-rest-framework