gpt4 book ai didi

python - 完整性错误owner_id DRF

转载 作者:行者123 更新时间:2023-12-01 04:11:28 26 4
gpt4 key购买 nike

我使用 Django Rest Framework 创建了一个简单的模型 API。大部分时间我都遵循 DRF 网站上的快速入门教程。我正在使用授权 token 从角度应用程序访问它。一切正常,除了当我想发表新帖子时......

这是我收到的错误列“owner_id”中的空值违反了非空约束

这是我的代码:models.py

class Post(models.Model)
title = models.CharField(max_length=100, blank=False)
point = models.PointField(max_length=255, null=True)
owner = models.ForeignKey('auth.User', related_name='posts')
active = models.NullBooleanField()
created = models.DateTimeField(auto_now_add=True)
expires = models.DateTimeField(blank=True, null=True)

序列化器.py

class PostSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')

class Meta:
model = Post
fields = ( 'owner', 'id', 'title', 'point', 'active', 'created', 'expires')

views.py

class PostList(APIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

def post(self, request, format=None):
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def perform_create(self, serializer):
serializer.save(owner=self.request.user)

谢谢。

最佳答案

好的,让我们一次一步地进行。首先,perform_create() 方法是在 ModelViewSet 使用的 create mixin 中定义的。在 APIView 派生 View 类中重写它不会执行任何操作。所以你的 Post 创建都是由 post() 方法处理的。修复错误的最简单方法是将 owner=self.request.user 添加到 post() 中的 serializer.save() 调用。

也就是说,您可能需要考虑将整个事物重新定义为 ModelViewSet,因为无论如何您可能都需要一整套 CRUD API。

class PostViewSet(viewsets.ModelViewSet):    class Meta:        queryset = Post.objects.all()        serializer_class = PostSerializer        permission_classes = (permissions.IsAuthenticatedOrReadOnly,)    def perform_create(self, serializer):        serializer.save(user=self.request.user)

关于python - 完整性错误owner_id DRF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34880593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com