为什么在 Django 模型中通过序列化程序从序列化数据填充十进制和字符字段时出现"This field may not be null"错误?



我试图通过DRF序列化器从序列化数据中填充Django模型中的DecimalFieldCharField字段,但我得到This field may not be null的奇怪错误。下面是我的模型定义:

class Product(BaseModel):
product = models.CharField(max_length=255)
recommended_action = models.CharField(max_length=255)
recommended_action_value = models.DecimalField(max_digits=12, decimal_places=8)
recommended_price = models.DecimalField(max_digits=12, decimal_places=8)
rrp = models.DecimalField(max_digits=12, decimal_places=8)
iam_price = models.DecimalField(max_digits=12, decimal_places=8)
iam_index = models.DecimalField(max_digits=12, decimal_places=8)
factor = models.DecimalField(max_digits=12, decimal_places=8)
avg_in_stock = models.DecimalField(
null=True, blank=True, max_digits=12, decimal_places=8
)

这是我的模型序列化器定义:

class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = models.Product
fields = "__all__"

我的观点是:

@api_view(['POST'])
def migrate_data(request, *args, **kwargs):
if request.method == "POST":
data = json.loads(request.body)
product_serialized_data = serializers.ProductSerializer(
data=data,
many=True,
context={"request": request},
)
if not product_serialized_data.is_valid():
print(product_serialized_data.errors)
product_serialized_data.save()
return Response(data={"detail": "Success"})

我传递给POST请求的数据:

{
"product": "DE_Ford_2095160",
"recommended_action": "increase",
"recommended_action_value": 0.0315553,
"recommended_price": 14.5862,
"rrp": 14.14,
"iam_price": 6.56898,
"iam_index": 0.464567,
"factor": 2.15254,
"avg_in_stock": 1
}

当我运行这段代码时,我得到以下错误:

[
{
'recommended_action': [ErrorDetail(string='This field may not be null.', code='null')],
'recommended_action_value': [ErrorDetail(string='This field may not be null.', code='null')],
'recommended_price': [ErrorDetail(string='This field may not be null.', code='null')],
'rrp': [ErrorDetail(string='This field may not be null.', code='null')],
'iam_index': [ErrorDetail(string='This field may not be null.', code='null')],
'factor': [ErrorDetail(string='This field may not be null.', code='null')]
}
]

因为你正在使用序列化器和api,你必须从request.data而不是request.body获得数据,所以你访问错误的数据,这是没有recommended_action字段的情况下的错误。

我不知道原因,但我只是在我的模型中添加了null = Trueblank = True,对于那些显示错误This may not be null的字段声明。因此,为我工作的更新模型代码如下:

class Product(BaseModel):
product = models.CharField(max_length=255)
recommended_action = models.CharField(max_length=255, null=True, blank=Ture)
recommended_action_value = models.DecimalField(max_digits=12, decimal_places=8, null=True, blank=Ture)
recommended_price = models.DecimalField(max_digits=12, decimal_places=8, null=True, blank=Ture)
rrp = models.DecimalField(max_digits=12, decimal_places=8, null=True, blank=Ture)
iam_price = models.DecimalField(max_digits=12, decimal_places=8, null=True, blank=Ture)
iam_index = models.DecimalField(max_digits=12, decimal_places=8, null=True, blank=Ture)
factor = models.DecimalField(max_digits=12, decimal_places=8, null=True, blank=Ture)
avg_in_stock = models.DecimalField(
null=True, blank=True, max_digits=12, decimal_places=8
)

我不知道原因,但它对我有效。如果有人知道原因,请解释一下,以便我和其他这个问题的观众了解这个问题的原因。