我有以下 django rest 框架序列化程式和模型視圖,Post為應用程式定義的模型如下。
現在我想測驗 API,因此嘗試從 API 頁面“創建”一個新帖子,但隨后出現錯誤IntegrityError at /api/posts/ NOT NULL constraint failed: appname_post.user_id。
然后我嘗試除錯并檢查它的request.data值,它說它只有titleandcontent但沒有user_id,正如我可以從上面的錯誤中預期的那樣。
但現在我不知道如何告訴 API 自動將user_id欄位關聯到request.user.id. 僅僅添加一行還不夠嗎?user_id = serializers.ReadOnlyField(source='user.id')我可以做“檢索”、“更新”、“補丁”等,但不能“發布”(創建)。
謝謝你的幫助。
- 序列化器和視圖
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)
uj5u.com熱心網友回復:
您可以覆寫perform_createModelViewSet 中的方法。
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/420193.html
標籤:
上一篇:我們如何在一個generics.ListAPIView中使用兩個不同的序列化器同時覆寫get_queryset()方法
