如何创建生成/计算列 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/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'))))
我还在django项目网站中找到了always_generate的解决方案。 在尝试了很多事情之后,终于有一种方法对我有用。
即从 models.py 中删除所有具有数据库触发器的列。 例如:- 自动增量列、当前时间戳列、生成列等。