Python django.core.exceptions.ValidationError值必须是十进制数
所以,我有两个不同的django模型,我想用一些字符串填充一个模型中的一个字段(配置为CharField),基于一个条件,另一个模型中的字符串是什么。我为此写了一个简单的方法:Python django.core.exceptions.ValidationError值必须是十进制数,python,django,Python,Django,所以,我有两个不同的django模型,我想用一些字符串填充一个模型中的一个字段(配置为CharField),基于一个条件,另一个模型中的字符串是什么。我为此写了一个简单的方法: def检测\关闭\原因(自身): 如果self.Recommension.stoploss为无: 返回“未识别” 其他: 返回“止损收盘” 在类的下一个方法中,我尝试在创建和保存模型实例的过程中调用此方法: def创建虚拟交易(self): 日期=自我推荐。发布时间 posix_date=datetime.times
def检测\关闭\原因(自身):
如果self.Recommension.stoploss为无:
返回“未识别”
其他:
返回“止损收盘”
在类的下一个方法中,我尝试在创建和保存模型实例的过程中调用此方法:
def创建虚拟交易(self):
日期=自我推荐。发布时间
posix_date=datetime.timestamp(日期)
vo=VirtualTransaction.objects.create(开始价格=self.recommendation.buy水平,
开始日期=posix日期,
结束价格=自我推荐。卖出水平,
结束日期=无,
是否关闭=无,
author=self.take_author(),
股票=自我推荐股票,
硬币=自我推荐。硬币,
关闭\u原因=自身。检测\u关闭\u原因())
vo.save()
当我通过django管理命令运行此命令时,我收到以下错误:
我曾尝试重置迁移,删除并创建一个DB(PostgreSQL 11.4),但都没有用
migrations.CreateModel(
名称:'推荐',
田地=[
('id',models.AutoField(auto_created=True,primary_key=True,serialize=False,verbose_name='id'),
('channel_name',models.CharField(blank=True,max_length=2000)),
('channel_forwarded_name',models.CharField(blank=True,max_length=2000)),
('stock',models.CharField(blank=True,max_length=2000)),
('coin',models.CharField(blank=True,max_length=2000)),
('message',models.TextField(blank=True,null=True)),
('buy_levels',models.CharField(blank=True,max_length=2000)),
('sell_levels',models.CharField(blank=True,max_length=2000)),
('posted_time',models.DateTimeField(默认值=None)),
('stoploss',models.CharField(blank=True,max_length=2000)),
],
选择权={
‘订购’:(‘频道名称’、‘发布时间’),
},
),
migrations.CreateModel(
name='VirtualTransaction',
田地=[
('id',models.AutoField(auto_created=True,primary_key=True,serialize=False,verbose_name='id'),
('stock',models.CharField(blank=True,max_length=2000)),
('coin',models.CharField(blank=True,max_length=2000)),
('start_date',models.CharField(blank=True,max_length=2000)),
('end_date',models.CharField(blank=True,max_length=2000)),
(“起始价格”,models.DecimalField(小数位数=8,最大位数=16)),
('end_price',models.DecimalField(小数位数=8,最大位数=16)),
('is_closed',models.CharField(blank=True,max_length=2000)),
('closing_reason',models.CharField(blank=True,max_length=2000)),
('author',models.ForeignKey(在_delete=django.db.models.deletion.CASCADE上,to='parser.Recommender')),
我的\d+表名是由psql生成的
我在这里发现了一些类似的问题,但没有任何帮助,我尝试过:重置迁移,将字符串转换为十进制内置实例
我在django没有那么多的过期时间,我可能会犯一个愚蠢的错误,但我已经花了大约12个小时进行故障排除,所以我决定在这里写一个问题。这个错误是由模型
VirtualTransaction
中的2个DecimalField
中的一些(开始价格
或结束价格
)引起的。
看起来错误只出现在self.detect\u closing\u reason()
中,因为这是.objects.create()
的最后一个参数;实际发生错误的原因是
最有可能的是,CharField
sself.recommendation.buy\u levels
或self.recommendation.sell\u levels
的内容不能转换为Decimal
实例
另外,在使用方法.objects.create()
之后,如果在调用.objects.create()
之后不修改任何内容,则不需要对返回的对象调用.save()
为了更容易地发现错误,我建议将代码更改为:
def create_virtual_transaction(self):
date = self.recommendation.posted_time
posix_date = datetime.timestamp(date)
vo = VirtualTransaction()
vo.start_price = self.recommendation.buy_levels
vo.start_date = posix_date
vo.end_price = self.recommendation.sell_levels
vo.end_date = None
vo.is_closed = None
vo.author = self.take_author()
vo.stock = self.recommendation.stock
vo.coin = self.recommendation.coin
vo.closing_reason = self.detect_closing_reason()
vo.full_clean()
vo.save()
请注意对
vo.full_clean()
的调用;此行将引发更具体的错误消息,指示导致错误的字段。如果您将代码复制并粘贴到问题中而不是屏幕截图中,人们将更容易查看代码。请提供代码而不是快照
def create_virtual_transaction(self):
date = self.recommendation.posted_time
posix_date = datetime.timestamp(date)
vo = VirtualTransaction()
vo.start_price = self.recommendation.buy_levels
vo.start_date = posix_date
vo.end_price = self.recommendation.sell_levels
vo.end_date = None
vo.is_closed = None
vo.author = self.take_author()
vo.stock = self.recommendation.stock
vo.coin = self.recommendation.coin
vo.closing_reason = self.detect_closing_reason()
vo.full_clean()
vo.save()