首页 文章

Django REST框架NOT NULL约束失败

提问于
浏览
0

当我尝试通过发布以下JSON来创建新帖子时:

{
    "text": "test",
     "location": 1
}

我收到以下错误:

NOT NULL constraint failed: grapevineapp_post.location_id

models.py:

class Location(models.Model):
    name = models.CharField(max_length=80)
    created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.name

class Post(models.Model):
    text = models.CharField(max_length=512)
    owner = models.ForeignKey('auth.User', related_name='posts', on_delete=models.CASCADE)
    location = models.ForeignKey(Location, related_name='posts', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.text

views.py:

class PostList(generics.ListCreateAPIView):
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

class PostDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    queryset = Post.objects.all()
    serializer_class = PostSerializer

Serializers.py

class PostSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    text = serializers.CharField(required=False, allow_blank=True, max_length=512)
    owner = serializers.ReadOnlyField(source='owner.username')
    location = serializers.PrimaryKeyRelatedField(many=False, read_only=True)

    def create(self, validated_data):
        return Post.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.text = validated_data.get('text', instance.text)
        instance.location = validated_data.get('location', instance.location)
        instance.save()
        return instance
class UserSerializer(serializers.ModelSerializer):
    posts = serializers.PrimaryKeyRelatedField(many=True, queryset=Post.objects.all())

    class Meta:
        model = User
        fields = ('id', 'username', 'posts')

DB已被清除 . 已使用管理界面创建位置 . 我知道这个问题是微不足道的,但我无法让它发挥作用 .

1 回答

  • 0

    要详细说明Willem Van Onsem所说的内容,您将 PostSerializer.location 字段设置为 read-only . 您为其提供的json数据将被忽略(documentation),即它不会包含在您的 validated_data 中 .

    然后当你在 create 方法中调用 Post.objects.create(**validated_data) 时,它尝试创建一个没有location参数的 Post 实例,你就会得到错误 .

    编辑:在您上面关于queryset的评论之后 .

    您需要为其提供一个查询集以进行验证(documentation) . 在你的情况下你想要的

    location = serializers.PrimaryKeyRelatedField(
        many=False,
        queryset=Location.objects.all()
    )
    

相关问题