Django REST框架接收到“bad”DecimalField,但不要出错

2024-04-29 06:24:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一段代码,需要从ColdFusion系统获取帖子,当涉及到JSON时,这个系统非常不灵活,而且我对它没有太多的控制权。我遇到了一个问题,在ColdFusion上运行的自动化系统有时会将“空”分米线发送为“”。这会导致Django中出现验证错误,因为无法从空字符串转换十进制字段:

TOTAL_DEFECTS = models.DecimalField(max_digits=10, decimal_places=2, null = True)

JSON失败了。。。在

^{pr2}$

这应该只会产生一个空字段,但是它会出错,说这是无效的。从技术上讲,这不是因为,当然,在Python中不能这样做:

import decimal
decimal.Decimal("")

为了处理这个问题,我侵入了viewset的分派例程。我想知道有没有更好的方法。Hack-y代码:

@csrf_exempt # Because ColdFusion can't handle CSRF headers
def dispatch(self, request, *args, **kwargs):
    repregex = re.compile(r'"",') # This is actually done elsewhere in the real code
    nbody = repregex.sub('null,', request.body)
    request._body = nbody
    request._stream = BytesIO(nbody)
    a = super(XViewSet, self).dispatch(request, *args, **kwargs)
    if a.status_code != 201:
        #log errors here
        pass
    return a

这个方法适用于这个特定的案例,但我想可能离我能得到的理想还差得远。除了重写这个不打算重写的HttpRequest对象之外,还有没有一种更适合Django风格的方法来完成这个任务?在


Tags: django方法代码selfjsonrequest系统args
1条回答
网友
1楼 · 发布于 2024-04-29 06:24:54

是的,还有更好的办法!您的答案是序列化程序中的customize the ^{} options。我将使用additional arguments保持代码干燥,方法如下:

from rest_framework import serializers
from rest_framework.generics import ListCreateAPIView


class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'
        extra_kwargs = {'TOTAL_DEFECTS': {'allow_blank': True}}


class MyView(ListCreateAPIView):
    serializer_class = MySerializer

当然,您必须使用实际的序列化程序和视图切换MyModelMyView和{}。在

相关问题 更多 >