Django model.BooleanField为0/1

时间:2015-10-08 16:40:36

标签: python django django-models

BooleanField在BD中保留为0或1 ..如何获取值为()的数据列表,其中" 1" /" 0"而不是真/假

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

当我做:

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

我有:[{"姓名":" Tom","男":true},{"姓名":&# 34;莉莎""男性":假}]

但我需要:{{"姓名":" Tom","男":" 1"},{& #34;名称":"莉莎""男性":" 0"}]

最好的方法是什么?

P.S。对不起我的英文

1 个答案:

答案 0 :(得分:4)

解决方案-1使用CustomBooleanField

您可以继承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()方法以序列化其他类型),使用   cls kwarg

解决方案-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)