2015-10-08 34 views
1

BooleanField在BD中保留爲0或1 ..我如何獲取值爲(1)/「0」而不是真/假的數據列表Django model.BooleanField as 0/1

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

當我做:

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

我:[{ 「Name」: 「湯姆」, 「男」:真正},{ 「名」: 「麗莎」, 「男性」:假的}]

但是我需要:[{「name」:「Tom」,「male」:「1」},{「name」:「Lisa」,「male」:「0」}]

這樣做的最好方法是什麼?

P.S.對不起,我的英語

+0

只是在將'list(Person.objects.values())'(它將成爲一個dicts列表)的內容在傳遞給'json.dumps()'之前修改它的內容。 –

回答

2

解決方案-1使用CustomBooleanField

你也可以繼承的BooleanField並添加功能from_db_value返回作爲1/0True/False值。

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 

這會給你male價值1/0而不是True/False當你從數據庫中

方案2中獲得的價值使用自定義JSON編碼器:

docs,

要使用自定義JSONEncoder子類(例如on Ë該覆蓋 default()方法序列化附加類型),cls kwarg指定它

解-3使用列表解析:

另一種選擇是使用list comprehensions.

要從True/False轉換爲1/0,我們會將我們e 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) 
+1

謝謝,它是一個正常的解決方案,我知道它。但這不是我需要的。模型「人」可以有更多的領域,這種構造將佔用大量的空間。而這個解決方案是多做一次迭代,這會佔用過多的資源。我需要最好的解決方案,這將有一個較少的操作。作爲例子,我認爲使類將從models.BooleanField繼承並重寫「from_db_value」方法。你怎麼看待這件事? –

+1

或第二種方式可以創建自定義JSONEncoder並像這樣使用 json.dumps(data,cls = JSONEncoder) –

+1

自定義編碼器聽起來像是一個比繼承boolean字段更好的方法。 – Alasdair

相關問題