如何从DRF表单中发送null到IntegerField

7 浏览
0 Comments

如何从DRF表单中发送null到IntegerField

我有一个简单的模型:\n

class TestRentalObject(models.Model):
some_field = models.TextField()
build_year = models.PositiveSmallIntegerField(
    blank=True,
    null=True,
    validators=[MinValueValidator(1300), MaxValueValidator(2100)],
)

\n使用ModelSerializer:\n

class TestRentObjectSerializer(serializers.ModelSerializer):
class Meta:
    model = TestRentalObject
    fields = (
        "some_field",
        "build_year"
    )

\n这是来自表单的输入字段:\n


\n当我保持这个字段为空时,序列化器将其视为无效。\n

In [8]: data = {'some_field': 'some_text', 'build_year': ''}
In [9]: rs = TestRentObjectSerializer(data=data)
In [10]: rs.is_valid()
Out[10]: False
In [11]: rs.errors
Out[11]: {'build_year': [ErrorDetail(string='需要一个有效的整数。', code='invalid')]}

\n我认为问题在于我将build_year作为一个空字符串而不是None。但是如何正确处理呢?

0
0 Comments

问题的原因是在DRF中,当使用表单提交数据时,如果表单中的IntegerField字段没有提供值,则会引发错误。这是因为IntegerField字段要求一个非空值。

为了解决这个问题,可以在视图方法中进行一些处理。在上述代码中,首先检查请求数据中的"build_year"字段是否为空字符串。如果是空字符串,则删除该字段。然后,将处理过的请求数据传递给序列化器进行验证和保存。

这种处理方法可能看起来有点临时,但目前我没有找到更好的解决办法。

0