DRF: Can't create object null. Error: value in column "network_from_id" violates not-null constraint
DRF: Can't create object null. Error: value in column "network_from_id" violates not-null constraint
我想创建 Transaction 对象。但是有错误:
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).
我的代码有什么问题?使用 ModelViewSet 创建对象的正确方法是什么?
我的代码:
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):
网络 = obj.network_from
return NetworksSerializer(网络).data
def get_network_to(self, obj):
network = obj.network_to
return NetworksSerializer(network).data
如果您接受特定关系中的 None
值,请为字段添加 null=True
。
network_from = models.ForeignKey(Networks, on_delete=models.DO_NOTHING, null=True)
network_to = models.ForeignKey(Networks, on_delete=models.DO_NOTHING, null=True)
我想创建 Transaction 对象。但是有错误:
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).
我的代码有什么问题?使用 ModelViewSet 创建对象的正确方法是什么?
我的代码: 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): 网络 = obj.network_from return NetworksSerializer(网络).data
def get_network_to(self, obj):
network = obj.network_to
return NetworksSerializer(network).data
如果您接受特定关系中的 None
值,请为字段添加 null=True
。
network_from = models.ForeignKey(Networks, on_delete=models.DO_NOTHING, null=True)
network_to = models.ForeignKey(Networks, on_delete=models.DO_NOTHING, null=True)