我有一个遗留数据库,我为它创建了一个模型。它看起来像下面。
class Account(models.Model):
balance = models.DecimalField(max_digits=42, decimal_places=1, default=Decimal('0.0'))
当我运行以下查询时,我会balance field
作为None
使用该字段上的default
值。
Account.objects.get(pk=1).balance #returns None instead of Decimal(0.0).
我希望在SQL数据库的遗留余额为default Decimal(0.0)
时获得NULL
。
有没有办法告诉django orm给我默认的Decimal(0.0)
而不是None
。
提前致谢。
修改
我知道我们可以添加自定义方法或@property
并使其成为一个返回余额或默认值的方法,但我还运行其他一些查询,例如下面的一个。
Account.objects.values_list('balance') #returns [(1,),(None,),(None,)]
不使用默认值。
答案 0 :(得分: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()
答案 1 :(得分: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
。
希望这会有所帮助。
答案 2 :(得分: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)
希望这是与您的问题相关的地方。干杯:)
答案 3 :(得分:-2)
设置editable=False
。查看this了解更多信息。
balance = models.DecimalField(max_digits=42, decimal_places=1, default=Decimal('0.0'), editable=False)