我使用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)
感谢。
答案 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)