django rest框架:获取“This field may not be null.”with FloatField even with blank=True

72qzrwbm  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(154)

下面的代码显示了我的问题:
在我的django www.example.com中models.py我有如下内容:

class MyModel(Model):
    test_field = SlugField(blank=True, null=False)
    # some other not-null not-blank fields here   

     def save(self, *args, **kwargs):
         self.test_field = .... # Setting with a value calculated form the other not-null not-blank fields

这里是我的序列化器:

from rest_framework import serializers
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = [ ...., 'test_field',  ]

在我的www.example.com中views.py,类似于:

def post_endpoint(request):

    data = JSONParser().parse(request)
    serializer = MyModelSerializer(data=data)
    if serializer.is_valid():
        ....

        serializer.save()
        return JsonResponse(serializer.data, status=201)

这是按预期工作:我可以发送一个对象到我的 post_endpoint,而不需要我的 test_field,我得到了我的结果,test_field 设置为预期的。serializer.is_valid() 在这种情况下返回True。
什么问题?我需要相同的功能,但使用FloatField而不是 SlugField。但是我注意到 serializer.is_valid() 在这种情况下返回False,并且在我的视图函数中的 serializer.errors 中得到一个“This field may not be null.”。
FloatField和SlugField有什么不同?我怎样才能获得预期的功能也与FloatField?
djangorestframework==3.14.0 Django==4.0.5

dzhpxtsq

dzhpxtsq1#

我给予了一下,但它工作得很好:

模型

from django.db import models

class MyModel(models.Model):
    test_field_slug = models.SlugField(null=True, blank=True)
    test_field_float = models.FloatField(null=True, blank=True)
    test_field_str = models.CharField(max_length=255)

    def __str__(self):
        return self.test_field_str

    class Meta:
        verbose_name = "My Model"
        verbose_name_plural = "My Models"

序列化器

from rest_framework import serializers
from app1.models import MyModel

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = "__all__"

视图

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from app1.serializers import MyModelSerializer

class MyModelView(APIView):
    def post(self, request):
        serializer = MyModelSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

url

from django.urls import path
from app1.views import MyModelView

urlpatterns = [
    path('my-model/', MyModelView.as_view())
]

请求

❯ curl http://localhost:8000/my-model/ -d abc | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    49  100    46  100     3  13360    871 --:--:-- --:--:-- --:--:-- 16333
{
  "test_field_str": [
    "This field is required."
  ]
}
❯ curl http://localhost:8000/my-model/ -d test_field_str=abc | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    96  100    78  100    18   4551   1050 --:--:-- --:--:-- --:--:--  6000
{
  "id": 1,
  "test_field_slug": null,
  "test_field_float": null,
  "test_field_str": "abc"
}

我注意到您的代码中有一个问题,就是对序列化器输入数据的请求进行JSON解析。这是不需要的日志,因为你按照上述程序.

相关问题