美文网首页django.tip生活不易 我用python
让Django的BooleanField支持字符串形式的输入

让Django的BooleanField支持字符串形式的输入

作者: 治部少辅 | 来源:发表于2016-10-11 10:47 被阅读112次

再Django中,你可以把字符串形式的数值赋值给IntegerField,然后Django会默认把字符串转换成int。但是BooleanField则不行,BooleanField只能接受True和False,或者0和1(BTW:在python中True即是1,False即是0)。这对于很多网络参数上传的场景很不利,因为很多时候我们处于方便会将布尔型参数转换成字符串形式来上传。一个典型的场景是在使用Swfit的Alamofire框架中的upload来上传Multipartform时,由于form参数只能添加Data形式的参数,直接将Bool型转化成Data会非常麻烦,带来编码类型的问题。例如采用如下的方式进行转化:

let dataToUpload = Data(bytes: boolVal, count: MemoryLayout<Bool>.size)

以这种形式上传最后被django接收到时,这个字段的值会是"\x00"(False)或者"\x01"(True),导致编码类型的错误。所以一个较为方便的方法是将bool型变量转化成字符串再上传。

let toText = boolVal ? "1" : "0"
form.append(toText.data(using: String.Encoding.utf8, allowLossyConversion: false)!, withName: key)

不过,这样虽然避免了编码问题,但是在后台赋值时直接将这个字段赋给相应的BooleanField的话,会永远是True(这是当然的,将字符串直接用bool()做强制类型转换就会始终是True)。一个妥协的办法是现将得到的上传的字符型字段转换成Int,再赋值给BooleanField。不过,这里要给大家介绍一种更加整洁,更加一劳永逸的办法,就是我们来重定义BooleanField的行为,在为其复制时,自动将字符串以我们想要的规则转换成Bool值。代码如下:

from django.db.models import BooleanField as _BooleanField

class BooleanField(_BooleanField):    
    def get_prep_value(self, value):       
        if value in ("0", "false", "False"):            
            return False        
       elif value in ("1", "true", "True"):           
           return True        
       else:            
           return super(BooleanField, self).get_prep_value(value)

其中get_prep_value这个函数会在Django准备把字段的值写入数据库时调用。

相关文章

  • 让Django的BooleanField支持字符串形式的输入

    再Django中,你可以把字符串形式的数值赋值给IntegerField,然后Django会默认把字符串转换成in...

  • 对 Python 等动态语言的进一步认知

    起因 Django 的 django.forms.BooleanField 不能传递 false,如果想传,必须加...

  • 344-反转字符串

    反转字符串 题目 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 ...

  • 344. 反转字符串

    344. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出...

  • Leetcode之字符串篇

    1. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。...

  • leetcode探索初级算法之字符串

    1. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不...

  • leetcode 初级算法 字符串(C++)

    1.反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要...

  • 2019-02-05 Day 31

    1.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要...

  • 344. Reverse String

    编写一个函数,将输入的字符串反转过来。输入字符串以字符串数组 s 的形式给出。 不要给另外的数组分配额外的空间,必...

  • 反转字符串

    题目描述 难度级别:简单 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式...

网友评论

    本文标题:让Django的BooleanField支持字符串形式的输入

    本文链接:https://www.haomeiwen.com/subject/lhzvyttx.html