NOT NULL constraint failed null=True blank=True

Question:

despite having null and blank true in my models I always get

NOT NULL constraint failed: user_mgmt_profile.user_id

I’ve deleted the database, deleted migrations, run commands again, and the error still persist.

Where do you see the issue

Basically Im automatically connecting user to new profile on post request

models

class Profile(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    gym = models.OneToOneField(Gym, null=True, blank=True, on_delete=models.DO_NOTHING)

create function in viewset

def create(self, request):
    request.data['user'] = request.user.id
    serializer = ProfileSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        data = serializer.data
        return Response(data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers

class LocationSerializer(serializers.ModelSerializer):

    class Meta:
        model = Location
        fields = '__all__'

class GymSerializer(serializers.ModelSerializer):

    place = LocationSerializer(read_only=True)

    class Meta:
        model = Gym
        fields = '__all__'

class ProfileSerializer(WritableNestedModelSerializer, serializers.ModelSerializer):

    user = UserSerializer(read_only=True)
    gym = GymSerializer(read_only=True)

    class Meta:
        model = Profile
        fields = '__all__'
        depth = 1

edit
I’ve printed out the

request.data['user']

and i can see the UUID of the current user

Asked By: rafaelHTML

||

Answers:

The field is read only, hence that will not work. You need to pass it when saving the object:

def create(self, request):
    serializer = ProfileSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save(user=request.user)
        data = serializer.data
        return Response(data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Answered By: Willem Van Onsem