【发布时间】:2016-01-14 18:27:18
【问题描述】:
我正在使用 Django Rest Framework 为一个允许用户创建帖子并对这些帖子发表评论的网站构建一个 API。我可以从 API 创建帖子,但是当我尝试创建评论时,我收到以下错误:
NOT NULL 约束失败:app_comment.post_id
我的模型:
class Post(models.Model):
owner = models.ForeignKey('auth.User', related_name = 'posts')
post_title = models.CharField(max_length=200)
post_description = models.CharField(max_length=1000)
class Comment(models.Model):
user = models.ForeignKey(User, related_name = 'comments')
post = models.ForeignKey(Post, related_name = 'comments')
text = models.CharField(max_length=1000)
还有我的评论序列化器:
class CommentSerializer(serializers.ModelSerializer):
user = serializers.ReadOnlyField(source='user.username')
post = serializers.ReadOnlyField(source='post.id')
class Meta:
model = Comment
fields = ('id', 'text', 'user', 'post')
和我的评论观点:
class PostCommentList(generics.ListCreateAPIView):
permission_classes = (permissions.IsAuthenticated,
IsOwnerOrReadOnly,)
serializer_class = CommentSerializer
def get_queryset(self):
post = self.kwargs['post_pk']
post = Post.objects.get(pk = post)
return post.comments.all()
def perform_create(self, serializer):
post = self.kwargs['post_pk']
print("creating a comment from " + str(self.request.user) + " on post " + str(post) +" : "+ str(Post.objects.get(pk = post)))
serializer.save(user = self.request.user)
serializer.save(post = self.kwargs['post_pk'])
在尝试对帖子创建评论时,我看到打印出正确的信息(即“在帖子 6 上创建用户评论:帖子对象”)。
为什么没有使用正确的 post_id 创建我的 cmets?
【问题讨论】:
-
为什么要重载
get_queryset和perform_create?如果您不这样做,我想它应该可以正常工作。请检查一下好吗? -
我正在重载 get_queryset 以便仅返回附加到特定帖子的 cmets,并且我正在重载 perform_create 以便我可以从 url 和用户中获取帖子编号请求(类似于此处的示例:django-rest-framework.org/api-guide/generic-views)。我会尝试删除它们,但我相信它会破坏其他功能。
标签: django django-rest-framework