python - 完整性错误owner_id DRF

标签 python django django-rest-framework

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

相关文章:

Python:这应该是不可能的,不是吗?

python - 如何进行无限线程评论

python - Django 序列化器更新全部

python - Sqlalchemy 关系 : Order children by joined table

python-3.x - 在 Python 中使用 kwargs 添加参数

python - pytesseract.image_to_string 似乎无法从图像中提取文本

python - 查询按字母顺序过滤

python - 如何在 Django 中使用 Pytest 测试经过身份验证的 POST 请求

mysql - 如何使用 django mysql 在原始 sql 查询中传递动态变量

java - 无法导入 edu.stanford.nlp - 斯坦福解析器存在 jython 问题