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 值,它说它只有 titlecontent 但没有 user_id,正如我所期望的上面的错误。

但现在我不知道如何告诉 API 自动将 user_id 字段关联到 request.user.idIsn'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>