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)