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

rta7y2nd  于 2023-10-21  发布在  Go
关注(0)|答案(2)|浏览(174)

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

fafcakar

fafcakar1#

您真的需要将结果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类属性,而不是一个DB字段,所以它不能直接用于数据库查询。

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

ukxgm1gy2#

我也在django项目网站上找到了always_generated解决方案。在尝试了这么多方法之后,终于有一种方法适合我。
这只是REMOVECOMMENT所有来自models.py的具有db触发器的列条目。例如:-自动递增列,当前时间戳列,生成为列等。

# requesttimestamp = models.BigIntegerField(db_column='RequestTimeStamp', always_generated='createddate')  # Here I was getting that error.
# createddate = models.DateTimeField(db_column='CreatedDate', auto_now_add=True)

所以我注解了这两行,它就像预期的那样工作了。创建示例时也不需要传递任何东西到保存记录。

相关问题