Reputation: 732
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
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