IntegrityError en django rest framework

Estoy jugando con DRF e hice un blog simple donde personas anónimas pueden comentar en una publicación de blog. Estoy usando la API navegable en este momento, y todo parece funcionar bien hasta que bash publicar un comentario. ELIMINAR, OBTENER Y PONER funciona todo como se espera, solo POST.

El error que recibo es IntegrityError at /api/posts/i-had-a-blog-his-name-was-bingo/comments/: blog_comment.blogpost_id may not be NULL

He buscado minuciosamente una respuesta sobre por qué podría estar sucediendo esto, pero nada ayuda. Aquí está mi código …

modelos.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') 

vistas.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[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[-\w]+)/$', views.PostDetail.as_view(), name='post-detail'), url(r'^posts/(?P[-\w]+)/comments/', include(commentpatterns)), url(r'^users/$', views.UserList.as_view(), name='user-list'), url(r'^users/(?P[0-9]+)/$', views.UserDetail.as_view(), name='user-detail'), ) 

Cualquier ayuda sería muy apreciada, esto me está volviendo loco.

Su modelo de Comment define una ForeignKey , que no puede ser null :

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

lo cual está bien, pero su serializador no incluye el ID de blogpost , por lo que incluso si su solicitud lo incluye, simplemente se ignorará. corrija su serializador para incluir el campo blogpost :

 class CommentSerializer(serializers.HyperlinkedModelSerializer): post = serializers.Field(source='blogpost.title') blogpost = serializers.PrimaryKeyRelatedField() class Meta: model = Comment fields = ('id', 'author', 'content', 'post', 'blogpost') 

Ahora, cuando cree una solicitud de publicación, el campo de publicación de blog debe contener el id de la publicación de blog a la que está adjuntando este comentario.