如何从DRF中的表单发送Integerfield的null

时间:2019-01-17 10:40:32

标签: django python-3.x django-rest-framework

我有一个简单的模型:

class TestRentalObject(models.Model):
some_field = models.TextField()

build_year = models.PositiveSmallIntegerField(
    blank=True,
    null=True,
    validators=[MinValueValidator(1300), MaxValueValidator(2100)],
)

使用ModelSerializer:

class TestRentObjectSerializer(serializers.ModelSerializer):
class Meta:
    model = TestRentalObject

    fields = (
        "some_field",
        "build_year"
    )

这是表单中的输入字段:

<input type="number" class="input-group__input input-group__input_no-require is-invalid" id="field-rent.build_year" placeholder="" name="rent.build_year">

当我将此字段保留为空时,序列化程序将其视为无效。

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='A valid integer is required.', code='invalid')]}

我相信问题是我将build_year作为空字符串而不是无。但是如何正确执行呢?

1 个答案:

答案 0 :(得分:0)

正如NeErAj KuMaR在评论中建议的那样,我在视图方法中添加了几行。

    if request.data["rent"].get("build_year") == "":
        del request.data["rent"]["build_year"]

    serializer = TestRentObjectSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)

它看起来有些斑驳,但我没有找到更好的方法来实现这一点。