我使用 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/