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
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)
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
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)