Django model.BooleanField 值为 0/1

Posted

技术标签:

【中文标题】Django model.BooleanField 值为 0/1【英文标题】:Django model.BooleanField value as 0/1 【发布时间】:2016-01-06 09:50:59 【问题描述】:

当我收到带有query.values()BooleanFields 时,我需要接收一个字符串值('0''1') 例如,如果使用下一个模型:

class Person(models.Model):
    name = models.CharField()
    male = models.BooleanField()

然后做:

print json.dumps(list(Person.objects.values()))

我会收到这个:["name":"Tom","male":true,"name":"Lisa","male":false]

但我需要这个:["name":"Tom","male":"1","name":"Lisa","male":"0"]

最好的方法是什么?

【问题讨论】:

只需修改list(Person.objects.values()) 的内容(将是一个dicts 列表),然后再将其传递给json.dumps() 对于模板有一个yesno filter:***.com/a/846159 【参考方案1】:

使用CustomBooleanField的解决方案-1:

您可以将BooleanField 子类化并添加一个函数from_db_value,它将True/False 的值返回为1/0

class CustomBooleanField(models.BooleanField):

    def from_db_value(self, value, expression, connection, context):
        if value is None:
            return value
        return int(value) # return 0/1

然后在您的模型中,您可以将此自定义字段用于male

class Person(models.Model):
    name = models.CharField()
    male = CustomBooleanField() # use the custom field

当您从 db 获取值时,这将为您提供 male 的值,而不是 1/0,而不是 True/False

解决方案-2 使用自定义 json 编码器:

来自docs,

使用自定义 JSONEncoder 子类(例如,覆盖 default() 方法 来序列化其他类型),clskwarg

解决方案-3 使用列表推导:

另一种选择是使用list comprehensions.

要从True/False 转换为1/0,我们将使用int(some_boolean_value)

objects_list =  list(Person.objects.values())
modified_list = ["name":x["name"], "male": int(x["male"]) for x in objects_list] # use list comprehension
json.dumps(modified_list) 

【讨论】:

谢谢,这是一个正常的解决方案,我知道。但这不是我需要的。模型“人”可以有更多的字段,这种构造会占用很多空间。并且这个解决方案是再进行一次迭代,这会占用过多的资源。我需要最好的解决方案,这样操作会更少。例如,我认为要从 models.BooleanField 继承并重写“from_db_value”方法。你怎么看? 或第二种方法可以创建自定义 JSONEncoder 并像这样使用 json.dumps(data, cls=JSONEncoder) 自定义编码器听起来比对布尔字段进行子类化更好。 @TarasProtsenko 是的,公平点。用一个自定义的布尔字段更新了 ans。

以上是关于Django model.BooleanField 值为 0/1的主要内容,如果未能解决你的问题,请参考以下文章

django 模型——model 字段

Django - 学习目录

Django初识

Django之路

Django系列

django 错误