Django获取字段默认值如果为None
我有一个旧的数据库,我为它创建了一个模型。模型大概长这样。
class Account(models.Model):
balance = models.DecimalField(max_digits=42, decimal_places=1, default=Decimal('0.0'))
当我运行下面的查询时,balance 字段
的值显示为 None
,而不是使用这个字段的 default
值。
Account.objects.get(pk=1).balance #returns None instead of Decimal(0.0).
我希望当旧数据库中的余额是 NULL
时,能得到 default Decimal(0.0)
的值。有没有办法告诉 Django 的 ORM,让它在这种情况下返回默认的 Decimal(0.0)
,而不是 None
。
提前谢谢你。
编辑:
我知道我们可以添加自定义方法或者用 @property
来创建一个返回余额或默认值的方法,但我还运行了一些其他的查询,比如下面的这个。
Account.objects.values_list('balance') #returns [(1,),(None,),(None,)]
这个查询没有使用默认值。
4 个回答
-3
把 editable=False
设置上。想了解更多信息,可以看看 这个链接。
balance = models.DecimalField(max_digits=42, decimal_places=1, default=Decimal('0.0'), editable=False)
0
也许你可以自己定义一个自定义字段类,在里面重写 to_python
方法,这样就可以处理你特定的情况了。
这大概可以写成下面这样的代码:
import decimal
class DecimalField(models.DecimalField):
def to_python(self, value):
if value is None:
return decimal.Decimal('0.0')
super(DecimalField, self).to_python(value)
希望这对你的问题有帮助。加油! :)
0
在数据库中给某一列设置默认值,意思是如果你没有提供值,就会使用这个默认值。你是不是明确把这个列的值设置成了NULL
?如果是这样的话,NULL
就会被存储。你没有提供用来填充模型的查询语句。
看看这个表格……
CREATE TABLE testtbl
(
id NOT NULL PRIMARY KEY,
balance NUMERIC NULL DEFAULT 0
)
现在看看这两个插入语句
INSERT INTO testtbl (id, balance) VALUES (1, NULL);
INSERT INTO testtbl (id) VALUES (2);
在第一个情况下,尽管你设置了默认值,NULL
还是会被插入。第二个情况下,0
会被用作balance
的值。
希望这对你有帮助。
1
Python让你可以用很多不同的方法来解决问题,所以你可以创建一个模型方法:
class MyAppModel(models.Model):
....
def get_balace(self):
return self.balance if self.balance else Decimal(0.0)
....
或者你可以创建一个管理器(根据你的需求进行修改):
class MyAppManager(models.Manager):
def get_queryset(self):
return super(MyAppManager, self).get_queryset()
def get_balances(self):
results = []
items = self.get_queryset().all()
for item in items:
balance = item.balance if item.balance else Decimal(0,0)
results.append({'pk':item.pk,"balance":balance})
return results
然后在你的模型里:
class MyAppModel(models.Model):
...
objects = MyAppManager()
...
接着你可以进行查询:
balances = MyAppModel.objects.get_balances()