如何创建生成/计算列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((得到了一个意外的关键字参数'always_generated'

(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乘法(。

这些选项对你有用吗?


EDIT:在选项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'))))

最新更新