Alex
Alex

Reputation: 732

DRF: Can't create object null. Error: value in column "network_from_id" violates not-null constraint

I want to create Transaction object. But have error:

django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: null value in column "network_from_id" violates not-null constraint
DETAIL:  Failing row contains (6, 12, null, null).

What is wrong in my code? And what is the proper way to create object with ModelViewSet?

My code: models.py

class Networks(models.Model):
    Name = models.CharField(max_length=50)
    ...

class Transaction(models.Model):
    network_from = models.ForeignKey(Networks, on_delete=models.DO_NOTHING)
    network_to = models.ForeignKey(Networks, on_delete=models.DO_NOTHING)
    ...

view.py

class TransactionView(viewsets.ModelViewSet):
    serializer_class = TransactionSerializer
    queryset = Transaction.objects.all()

    def get_transaction_create_serializer(self, *args, **kwargs):
        serializer_class = TransactionSerializer
        kwargs["context"] = self.get_serializer_context()
        return serializer_class(*args, **kwargs)


    def create(self, request, *args, **kwargs):
        serializer = self.get_transaction_create_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        response = {"result": serializer.data}
        return Response(
            response, status=status.HTTP_201_CREATED, headers=headers
        )

serializers.py

class TransactionSerializer(serializers.ModelSerializer):
    network_from = serializers.SerializerMethodField()
    network_to = serializers.SerializerMethodField()

    class Meta:
        model = Fee
        fields = '__all__'
    
    def create(self, validated_data):
        instance = super().create(validated_data=validated_data)
        return instance
    

def get_network_from(self, obj): network = obj.network_from return NetworksSerializer(network).data

    def get_network_to(self, obj):
        network = obj.network_to
        return NetworksSerializer(network).data

Upvotes: 0

Views: 49

Answers (1)

NixonSparrow
NixonSparrow

Reputation: 6378

Add null=True for field, if you accept None values in specific relation.

network_from = models.ForeignKey(Networks, on_delete=models.DO_NOTHING, null=True)
network_to = models.ForeignKey(Networks, on_delete=models.DO_NOTHING, null=True)

Upvotes: 1

Related Questions