如何创建生成/计算列 Postgres/DJANGO?

问题描述 投票:0回答:2

如何创建生成/计算列 Postgres/DJANGO?

我尝试了两种方式:

(1) 按班级:

class Product(models.Model):
    name = models.CharField(max_length=200, null=True)
    precio_costo = models.FloatField(null=True)
    cantidad = models.IntegerField(null=True)
    monto_stock = models.FloatField(
        always_generated='precio_costo * cantidad', stored=True)

我得到的错误:

TypeError:init()得到了意外的关键字参数 “总是生成”

(2) 直接由 POSTGRES 管理员

但是我无法更新或添加新字段,Django 需要默认值。

django postgresql calculated-columns
2个回答
0
投票

您真的需要将结果

monto_stock
存储在数据库中吗?

如果不是,那么也许只需在类上使用 Python 方法/属性:

class Product(models.Model):
    name = models.CharField(max_length=200, null=True)
    precio_costo = models.FloatField(null=True)
    cantidad = models.IntegerField(null=True)

    @property
    def monto_stock(self):
        return self.precio_costo * self.cantidad

如果是,那么也许可以在模型中计算结果

save()
方法:

class Product(models.Model):
    name = models.CharField(max_length=200, null=True)
    precio_costo = models.FloatField(null=True)
    cantidad = models.IntegerField(null=True)
    monto_stock = models.FloatField(null=True)

    def save(self, *args, **kwargs):
        self.monto_stock = self.precio_costo * self.cantidad
        super().save(*args, **kwargs)

请小心:您的字段允许 NULL,因此如果任何字段实际上包含值 NULL,则会出现错误(因为您无法在 Python 中进行 NULL/None 乘法)。

这些选项对您有用吗?


编辑:在选项 1 的情况下,要在视图中使用属性

monto_stock
,您可以像模型的任何其他属性一样访问它(但它将是只读的)。例如:

# get a single product
p = Product.objects.first()
print(p.monto_stock)

# get sum of all products
print(sum(p.monto_stock for p in Product.objects.all()))

请注意,因为它是Python类属性而不是数据库字段,所以不能以这种方式直接在数据库查询中使用。

# will NOT work
print(Product.objects.aggregate(Sum('monto_stock'))))

0
投票

我还在django项目网站中找到了always_generate的解决方案。 在尝试了很多事情之后,终于有一种方法对我有用。

即从 models.py 中删除所有具有数据库触发器的列。 例如:- 自动增量列、当前时间戳列、生成列等。

© www.soinside.com 2019 - 2024. All rights reserved.