Django REST Framework NOT NULL constraint failed

旧街凉风 提交于 2021-02-10 14:56:19

问题


when I try to create a new Post by posting the following JSON:

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

I get the following error:

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 has already been cleared. Locations have been created by using the admin interface. I know that the issue is something trivial, but I just can't get it to work.


回答1:


To elaborate on what Willem Van Onsem said, you have your PostSerializer.location field set as read-only. The json data that you provided for it will be ignored (documentation), i.e. it won't be included in your validated_data.

Then when you call Post.objects.create(**validated_data) in your create method it tries to create an instance of Post without the location argument and you get your error.

EDIT: After your comment above about queryset.

You need to provide a queryset for it to validate against (documentation). In your case you want

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


来源:https://stackoverflow.com/questions/53687071/django-rest-framework-not-null-constraint-failed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!