完整性错误owner_id DRF

时间:2016-01-19 15:24:41

标签: python django django-rest-framework

我使用Django Rest Framework创建了一个简单的模型API。在大多数情况下,我都遵循DRF网站上的快速入门教程。 我使用授权令牌从角度应用程序访问它。一切正常,除非我想发一个新帖...

这是我在列#34; 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)

serializers.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)

感谢。

1 个答案:

答案 0 :(得分:2)

好的,让我们一步一步。首先,perform_create()方法在ModelViewSet使用的create mixin中定义。在APIView派生的视图类中覆盖它并没有做任何事情。所以你的Post创建都是由post()方法处理的。解决错误的最简单方法是在帖子()中为owner=self.request.user电话添加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)