如果没有,则Django获取字段的默认值

时间:2014-08-05 11:00:59

标签: python sql django django-models django-queryset

我有一个遗留数据库,我为它创建了一个模型。它看起来像下面。

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,)]

不使用默认值。

4 个答案:

答案 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)