Django: Сбой ограничения NOT NULL: appname_post.user_id

У меня есть следующий сериализатор django rest framework и представление для модели Post, а модели, определенные для приложения, следующие

Теперь я хотел протестировать API, поэтому попытался "создать" новый пост со страницы API, но затем получил ошибку IntegrityError at /api/posts/ NOT NULL constraint failed: appname_post.user_id.

Потом я попытался отладить и проверил его значение request.data, оно говорит, что у него есть только title и content, но не user_id, как я мог ожидать из ошибки выше.

Но теперь я понятия не имею, как сказать API автоматически связать поле user_id с request.user.id. Разве недостаточно просто добавить строку user_id = serializers.ReadOnlyField(source='user.id')? Я могу сделать "retrieve", "update", "patch" и т.д., но только не могу "post" (create).

Спасибо за помощь.

  • сериализатор и представление

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)

Вы можете переопределить perform_create метод внутри ModelViewSet.

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)
        return super().perform_create(serializer)
Вернуться на верх