问题描述
如何创建“生成/计算”列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)
我得到的错误:
(2)直接由POSTGRES管理员
解决方法
您真的需要将结果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'))))