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

问题描述

如何创建“生成/计算”列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需要使用认值。

解决方法

您真的需要将结果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 /无乘法),都会出错。

这些选项对您有用吗?


编辑:对于选项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类属性而不是DB字段,因此不能以这种方式直接在数据库查询中使用它。

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