Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django.core.exceptions.ValidationError值必须是十进制数_Python_Django - Fatal编程技术网

Python django.core.exceptions.ValidationError值必须是十进制数

Python django.core.exceptions.ValidationError值必须是十进制数,python,django,Python,Django,所以,我有两个不同的django模型,我想用一些字符串填充一个模型中的一个字段(配置为CharField),基于一个条件,另一个模型中的字符串是什么。我为此写了一个简单的方法: def检测\关闭\原因(自身): 如果self.Recommension.stoploss为无: 返回“未识别” 其他: 返回“止损收盘” 在类的下一个方法中,我尝试在创建和保存模型实例的过程中调用此方法: def创建虚拟交易(self): 日期=自我推荐。发布时间 posix_date=datetime.times

所以,我有两个不同的django模型,我想用一些字符串填充一个模型中的一个字段(配置为CharField),基于一个条件,另一个模型中的字符串是什么。我为此写了一个简单的方法:

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
s
self.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()