Django - 注释并将加密的文本字段转换为小数点后 2 位的浮点字段



我正在使用Django pgcrypto字段来加密模型中的金额值Invoice如下:

from pgcrypto import fields
class Invoice(models.Model):
# Some other fields
amount_usd = fields.TextPGPSymmetricKeyField(default='')
objects = InvoicePGPManager()  # Manager used for PGP Fields

我正在使用TextPGPSymmetricKeyField,因为我必须将值存储为浮点数,而django-pgcrypto-fields没有 FloatField 的等效值。

现在我需要通过 API 传递这个amount_usd值,并且我必须将小数限制为最多两位。

我尝试使用以下方法:

Invoice.objects.all().values('amount_usd').annotate(
amount_to_float=Cast('amount_usd', FloatField())
)

但这会产生错误,因为字节(加密数据(无法转换为浮点数。

我也尝试使用它:

from django.db.models import Func
class Round(Func):
function = 'ROUND'
template='%(function)s(%(expressions)s, 2)'

Invoice.objects.all().annotate(PGPSymmetricKeyAggregate(
'amount_usd')).annotate(amount=Cast(
'amount_usd__decrypted', FloatField())).annotate(
amount_final = Round('amount'))

我收到以下错误:

django.db.utils.ProgrammingError: function round(double precision, integer) does not exist
LINE 1: ...sd, 'ultrasecret')::double precision AS "amount", ROUND(pgp_...
^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

有没有办法将加密字段转换为最多 2 位小数的浮点字段?

你的错误说:double precision AS "amount"这是因为您正在将amount_usd转换为在 SQL 中转换为双精度的FloatField

尝试使用带有参数的DecimalField(转换为 SQL 中的数字类型(。

Invoices.objects.all().annotate(amount=Cast(
PGPSymmetricKeyAggregate('amount_usd'),
DecimalField(max_digits=20, decimal_places=2)))

查看此处的文档: Django DecimalField

相关内容

  • 没有找到相关文章

最新更新