Bee Lance
Bee Lance

Reputation: 47

Django REST POST null value in column "user_id" violates not-null constraint

I have error after send post request for creating new item in user field - it return null value in column "user_id" violates not-null constraint DETAIL: Failing row contains (61, My Company, {2,3}, 2020-08-08 10:41:54.355926+00, My desc, 2, 2, null). . My data for send in JSON

{
    "name": "My Company", 
    "members":[2, 3] , 
    "user": 2, 
    "description": "My desc", 
    "status": 2, 
    "theme": 2
}

serializers.py

class AccountSerializer(serializers.ModelSerializer):
    user=serializers.StringRelatedField(read_only=False)
    class Meta:
        model=Account
        fields='__all__'

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

class CompanySerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        try:
            if self.context['request'].method in ['GET']:
                self.fields['members'] = serializers.SerializerMethodField()
        except KeyError:
            pass

    class Meta:
        model = Company
        fields = '__all__'
        
    def get_members(self, obj):
        accounts = Account.objects.filter(id__in=obj.members)
        return AccountSerializer(accounts, many=True).data
        
class CompanyListSerializer(serializers.ModelSerializer):
    class Meta: 
        model = Company
        fields = '__all__'

Upvotes: 0

Views: 709

Answers (1)

Sagar Adhikari
Sagar Adhikari

Reputation: 1392

Looking at other questions of yours, it seems like you need user = UserSerializer(read_only=True) for GET request only. If so,

class CompanySerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        try:
            if self.context['request'].method in ['GET']:
                self.fields['members'] = serializers.SerializerMethodField()
                self.fields['user'] = UserSerializer()
        except KeyError:
            pass

    class Meta:
        model = Company
        fields = '__all__'
        
    def get_members(self, obj):
        accounts = Account.objects.filter(id__in=obj.members)
        return AccountSerializer(accounts, many=True).data

Upvotes: 1

Related Questions