![](/img/trans.png)
[英]How to provide choices to django rest framework DecimalField serializer?
[英]django how to use Choices for a Model DecimalField
我需要有一个字段来存储(-20 到 20 步长为 0.25)范围内的值,并且值应该显示为(1.50、3.00、5.25),所以我认为我应该在一些搜索后使用小数而不是浮点数我已经使用这个 function 来生成所需的范围:
def decimal_range(A, B, X):
"""
function to generate decimal floating numbers from start(A), to end(B), by step(X)
"""
getcontext().prec = 5
while A < B:
yield float(A)
A += Decimal(X)
并像这样生成归档的选择。
S_CHOICES = tuple(tuple([i, f"{i:.2f}"]) for i in decimal_range(-20, 20.25, 0.25))
结果元组是
((-20.0, '-20.00'), (-19.75, '-19.75'), (-19.5, '-19.50'), (-19.25, '-19.25'), (-19.0, '-19.00') , ...)
model 字段是
arrs = models.DecimalField(max_digits=4, decimal_places=2, choices=S_CHOICES, null=True, blank=True, default=None)
在查看 db.sqlite3 文件时,我看到一些不同的值,例如(-20 instead of -20.0)
。
当从 python shell 检查字段值时,它就像Decimal('15.00'), Decimal('4.50')
最后,如果我将此字段的值提交为 7.50 或 7.00 的表单,它会被正确保存和检索,但是当尝试更新此表单时,字段值将为空,但如果值像 1.75 或 -13.75 它工作没有任何问题。
有人请指教...
经过一些尝试和错误后,我找到了选择 models.DecimalField 的正确方法,所以我认为这可能对其他人有所帮助。
分配给十进制字段的方法是通过 decimal.Decimal object 或字符串 - 不是 Python 浮点数。
所以我将选择元组调整为:
from decimal import Decimal
S_CHOICES = tuple(tuple([Decimal(f"{i:.2f}"), f"{i:.2f}"]) for i in decimal_range(-20, 20.25, 0.25))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.