IntegrityError在django休息框架 [英] IntegrityError in django rest framework

查看:104
本文介绍了IntegrityError在django休息框架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在和DRF一起玩,并做了一个简单的博客,匿名人士可以在博客上发表评论。我正在使用可浏览的API,一切似乎都可以正常工作,直到我尝试发表评论。 DELETE,GET和PUT都按预期工作,只有POST。

I'm playing with DRF and made a simple blog where anonymous people can comment on a blog post. I'm just using the browsable API at the moment, and everything seems to work fine until I try to post a comment. DELETE, GET, and PUT all work as expected, only POST.

我得到的错误是 IntegrityError at / api / posts / i-had-a-blog-his-name-was-bingo / comments /:blog_comment.blogpost_id可能不是NULL

我已经彻底搜索了解为什么会发生这种情况的答案,但没有什么是帮助。这是我的代码...

I've searched thoroughly for an answer as to why this might be happening, but nothing is helping. Here's my code...

models.py

class BlogPost(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey('auth.User', related_name='posts')
    title = models.CharField(max_length=100, unique=True)
    content = models.TextField()
    slug = models.SlugField(max_length=100, unique=True, editable=False)
    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(BlogPost, self).save(*args, **kwargs)
    @permalink
    def get_absolute_url(self):
        return ('post-detail', { 'slug': self.slug })
    class Meta:
        ordering = ('created',)

class Comment(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    blogpost = models.ForeignKey(BlogPost, related_name='comments')
    author = models.CharField(max_length=100, blank=False)
    content = models.TextField()
    class Meta:
        ordering = ('created', 'author', 'content')

serializers.py

class CommentSerializer(serializers.HyperlinkedModelSerializer):
    post = serializers.Field(source='blogpost.title')

    class Meta:
        model = Comment
        fields = ('id', 'author', 'content', 'post')    


class BlogPostSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.Field(source='owner.username')
    url = serializers.HyperlinkedIdentityField(view_name='post-detail')
    comments = serializers.HyperlinkedIdentityField(view_name='comment-list')

    class Meta:
        model = BlogPost
        fields = ('url', 'id', 'title', 'content', 'owner', 'comments')

views.py

class CommentList(generics.ListCreateAPIView):
    serializer_class = CommentSerializer

    def get_queryset(self):
        slug = self.kwargs['slug']
        return Comment.objects.filter(blogpost__slug=slug)


class CommentDetail(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = CommentSerializer
    permission_classes = (IsAdminOrNoEdit,)

    def get_queryset(self):
        slug = self.kwargs['slug']
        return Comment.objects.filter(blogpost__slug=slug)

urls.py

commentpatterns = patterns('',
    url(r'^$', views.CommentList.as_view(), name='comment-list'),
    url(r'^(?P<pk>[0-9]+)/$', views.CommentDetail.as_view(), name='comment-detail'),
)


urlpatterns = patterns('blog.views',
    url(r'^$', 'api_root'),
    url(r'^posts/$', views.PostList.as_view(), name='post-list'),
    url(r'^posts/(?P<slug>[-\w]+)/$', views.PostDetail.as_view(), name='post-detail'),
    url(r'^posts/(?P<slug>[-\w]+)/comments/', include(commentpatterns)),
    url(r'^users/$', views.UserList.as_view(), name='user-list'),
    url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view(), name='user-detail'),
)

任何帮助将不胜感激,这让我疯狂。

Any help would be greatly appreciated, this is driving me crazy.

推荐答案

您的评论模型定义了一个 ForeignKey 这不允许为 null

Your Comment model defines a ForeignKey, which is not allowed to be null:

class Comment(models.Model):
    ...
    blogpost = models.ForeignKey(BlogPost, related_name='comments')
    ...

这是可以的,但是你的序列化器不包括 blogpost id,所以即使你的请求包含它,它将被忽略。更正您的串行器,以包含 blogpost 字段:

which is ok, but your serializer does not include the blogpost id, so even if your request includes it, it will be just ignored. correct your serializer to include the blogpost field:

class CommentSerializer(serializers.HyperlinkedModelSerializer):
    post = serializers.Field(source='blogpost.title')
    blogpost = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Comment
        fields = ('id', 'author', 'content', 'post', 'blogpost')

现在,当您创建发布请求时, blogpost 字段应包含 id 您附加此评论的博文。

now when you create a post request, the blogpost field should contain the id of the blog post to which you're attaching this comment.

这篇关于IntegrityError在django休息框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆