Django获取字段默认值如果为None

0 投票
4 回答
6284 浏览
提问于 2025-04-18 16:03

我有一个旧的数据库,我为它创建了一个模型。模型大概长这样。

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()

撰写回答