【问题标题】:Boolean Field always saving False django布尔字段总是保存 False django
【发布时间】:2019-11-13 08:17:19
【问题描述】:

我正在使用 Django Rest Framework,当有效负载来自发布请求时,我有一个 boolean 字段 company_status,该字段为 true,但当用户保存它时变为 False,我无法得到问题所在:

views.py

class CreateUser(APIView):

    def get(self,request):
        return Response([UserSerializer(dat).data for dat in User.objects.all()])

    def post(self,request):
        payload=request.data
        serializer = UserSerializer(data=payload) 
        print(payload)  # here it shows company_status True
        if serializer.is_valid():
            instance = serializer.save()
            instance.set_password(instance.password)
            instance.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ['id','username','user_image','designation','company_status','age','gender']

    def create(self, validated_data):
        user = User.objects.create(**validated_data)
        return user

    def update(self, instance, validated_data):
        for k, v in validated_data.items():
            setattr(instance, k, v)
            instance.save()
        return instance

models.py

class User(AbstractBaseUser,PermissionsMixin):

    # is_admin=models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    date_joined = models.DateTimeField(null=True, blank=True)
    user_image=models.ImageField(upload_to=user_main_image_directory_path,null=True,blank=True)
    username = models.CharField(

        max_length=150,
        unique=True,
        null=True,

    )
    is_active = models.BooleanField(default=True)
    phonenumber=models.CharField(max_length=13,default="null")
    faceid=HashidField
    is_booker=models.BooleanField(default=False)
    designation=models.CharField(max_length=30,null=True)
    company_status=models.BooleanField(null=True,blank=True)  # this is the field
    object = UserManager()
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []
    age=models.IntegerField(null=True)
    gender=models.CharField(max_length=10,null=True,blank=True)

回复

Response:

        "id": 1,
        "username": "nabeel",
        "user_image": "/media/1/opencv_frame_0.jpg",
        "designation": "bscs",
        "company_status": false,
        "age": 23,
        "gender": "male"
    }

请求负载

Request payload:
payload={
age:25
company_statu:true
designation:bscs
gender:male
password:manofsteel#2
username:xyz
}

不明白为什么它总是在 company_status 中保存 False,我已经打印了来自 post 请求的有效负载并且它显示 True,但是当序列化程序保存时它显示为 false

【问题讨论】:

  • 您可以发布您的请求负载吗?
  • 添加有问题
  • 请求载荷有company_statu:true;这是一个错字(company_statu 而不是 status)。
  • key应该是company_status,但是是company_statu
  • 不,我错误地没有粘贴到这里,它的 company_status 在请求中

标签: python django django-models django-rest-framework


【解决方案1】:

首先,我建议您修改您的序列化程序以检查序列化程序是否收到 company_status。使其更改如下:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ['id','username','user_image','designation','company_status','age','gender']
        extra_kwargs = dict(company_status=dict(required=True, allow_null=False))

    def create(self, validated_data):
        user = User.objects.create(**validated_data)
        return user

    def update(self, instance, validated_data):
        for k, v in validated_data.items():
            setattr(instance, k, v)
            instance.save()
        return instance

如果序列化程序引发 ValidationError,那么很可能您的序列化程序无法理解 request.data,因此无法正确反序列化。在这里,您必须查看您的 React 代码是否在请求标头中使用 content-type:application/json 发送。

其次,如果不是这种情况,请检查您的模型迁移,可能一开始您有 default=False 的布尔字段,然后您进行了更改,但忘记迁移更改。

第三,即使它没有帮助,如果您之前对数据库设置进行了一些更改,那么问题可能在您的数据库配置的最低级别更深层次。

即使不是这样,我也很抱歉地告诉你,你搞砸了你的项目设置。

【讨论】:

    【解决方案2】:

    如果您使用new FormData() 构建有效负载,则序列化程序将正确处理任何布尔字段,但如果您使用表并在所有数据都存在时提交一行 (POST) 或在进行了更改(PUT),那么您要提交的数据周围没有<form id="form_name"></form> 标签,因此无法使用new FormData(form_name) 创建有效负载。以下是在后一种情况下创建有效负载的工作(请注意,复选框值设置为onoff,并以您期望的相反方式设置):

    function submitRow($tr, deleteRow) {
        // Build data for submission but return if any item does not have data
        var data = {};
        ready = true;
        if (!deleteRow) {
            // Determine whether all data in a row is present
            $tr.find('input, select').each(function(idx, el){
                if ($(el).val() == '' && !($(el).attr('type') == 'checkbox')) {
                    ready = false;
                    return false;
                }
                // The state of the checkbox is still opposite at this point
                if ($(el).attr('type') == 'checkbox' && el.checked) {
                    data[$(el).attr('name')] = 'on';
                } else if ($(el).attr('type') == 'checkbox' && !el.checked) {
                    data[$(el).attr('name')] = 'off';
                } else {
                    data[$(el).attr('name')] = $(el).val();
                }
            })
        }
        data['csrfmiddlewaretoken'] = $('input[name="csrfmiddlewaretoken"]').val();
    
        if (ready) {
            data = JSON.stringify(data);
            // Set up submission type
            if (deleteRow) {
                var method = 'DELETE'
                var url = '/child/delete/' + $tr.data('child-reg-id') + '/'
            }
            else if ($tr.data('child-reg-id') == '') {
                var method = 'POST'
                var url = '/child/add/'
            } else {
                var method = 'PUT'
                var url = '/child/update/' + $tr.data('child-reg-id') + '/'
            }
            
            fetch(url, {
                method: method,
                headers: {
                    "X-CSRFToken": $('input[name="csrfmiddlewaretoken"]').first().val(),
                    "Accept": "application/json",
                    "Content-Type": "application/json"
                },
                credentials: 'include',
                body: data
            })
            .then(function(result) {
                return result.json();
            })
            .then(function(data) {
                // Final logic to process the returned data
            })
        }
    }
    

    一定要像这样设置tr的提交:

    $('table tbody').on("change", "tr input, tr select", function(e) {
        submitRow($(e.target).closest('tr'), false);
    })
    // Handle deleting a row in which a Font Awesome "remove" icon is present in the row and is clicked to delete the row
    $('table tbody').on("click", ".fa-remove", function(e) {
        submitRow($(e.target).closest('tr'), true);
    })
    

    【讨论】:

      猜你喜欢
      • 2018-07-05
      • 2017-11-23
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多