Django:NOT NULL 约束失败:appname_post.user_id
Django: NOT NULL constraint failed: appname_post.user_id
我有以下 django rest 框架序列化器和模型视图 Post
,为应用程序定义的模型如下。
现在我想测试 API,因此尝试从 API 页面“创建”一个新的 post,但随后出现错误 IntegrityError at /api/posts/
NOT NULL constraint failed: appname_post.user_id
.
然后我尝试调试并检查它的 request.data
值,它说它只有 title
和 content
但没有 user_id
,正如我所期望的上面的错误。
但现在我不知道如何告诉 API 自动将 user_id
字段关联到 request.user.id
。 Isn't not enough 只添加 user_id = serializers.ReadOnlyField(source='user.id')
行?我可以执行“检索”、“更新”、“补丁”等操作,但不能执行“post”(创建)。
感谢您的帮助。
- 序列化器和视图
class DevPerm(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return True
def has_permission(self, request, view):
return True
class PostSerializer(serializers.HyperlinkedModelSerializer):
user_id = serializers.ReadOnlyField(source='user.id')
class Meta:
model = Post
fields = ('url',
'id',
'title',
'content',
'created_at',
'voters',
'comments',
'user_id',
)
read_only_fields = (
'id',
'created_at',
"voters",
"comments",
# "user_id",
)
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = [permissions.IsAuthenticated, DevPerm,]
- 型号
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts', default="")
created_at = models.DateTimeField(auto_now_add=True)
title = models.TextField(blank=True)
content = models.TextField(blank=True)
voters = models.ManyToManyField(User, related_name='votes', default="")
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comments', default="")
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments', default="")
created_at = models.DateTimeField(auto_now_add=True)
content = models.TextField(blank=True)
您可以在 ModelViewSet 中覆盖 perform_create
方法。
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = [permissions.IsAuthenticated, DevPerm,]
def perform_create(self, serializer):
serializer.save(user=self.request.user)</pre>
我有以下 django rest 框架序列化器和模型视图 Post
,为应用程序定义的模型如下。
现在我想测试 API,因此尝试从 API 页面“创建”一个新的 post,但随后出现错误 IntegrityError at /api/posts/
NOT NULL constraint failed: appname_post.user_id
.
然后我尝试调试并检查它的 request.data
值,它说它只有 title
和 content
但没有 user_id
,正如我所期望的上面的错误。
但现在我不知道如何告诉 API 自动将 user_id
字段关联到 request.user.id
。 Isn't not enough 只添加 user_id = serializers.ReadOnlyField(source='user.id')
行?我可以执行“检索”、“更新”、“补丁”等操作,但不能执行“post”(创建)。
感谢您的帮助。
- 序列化器和视图
class DevPerm(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return True
def has_permission(self, request, view):
return True
class PostSerializer(serializers.HyperlinkedModelSerializer):
user_id = serializers.ReadOnlyField(source='user.id')
class Meta:
model = Post
fields = ('url',
'id',
'title',
'content',
'created_at',
'voters',
'comments',
'user_id',
)
read_only_fields = (
'id',
'created_at',
"voters",
"comments",
# "user_id",
)
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = [permissions.IsAuthenticated, DevPerm,]
- 型号
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts', default="")
created_at = models.DateTimeField(auto_now_add=True)
title = models.TextField(blank=True)
content = models.TextField(blank=True)
voters = models.ManyToManyField(User, related_name='votes', default="")
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comments', default="")
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments', default="")
created_at = models.DateTimeField(auto_now_add=True)
content = models.TextField(blank=True)
您可以在 ModelViewSet 中覆盖 perform_create
方法。
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = [permissions.IsAuthenticated, DevPerm,]
def perform_create(self, serializer):
serializer.save(user=self.request.user)</pre>