django - 类型字符变化的值太长(25)
问题描述
我在将 CSV 文件上传到我的数据库时遇到了麻烦,当我尝试上传文件时,我收到“对于类型字符变化 (25) 类型的值太长”的错误消息performance_exccy
(请参阅下面的 django 模型)。当我从 SQLite 切换到 PostgreSQL(使用 ElephantSQL)时,开始出现此错误消息,使用 SQLite 上传完美。
导致问题的值是 0.000000000000000000,它有 20 个字符,但在我的模型中我定义max_digit = 40
了dec_places =20
- 所以位数应该不是问题。我还注意到上传错误不是从 CSV 文件的第一行开始,而是从第 12 行开始,之前的行具有相似长度的值。
我的模型:
class Testdata3(models.Model):
key = models.CharField(max_length=100, primary_key=True)
mnemonic = models.CharField(max_length=50)
assetclass = models.CharField(max_length=25)
value = models.DecimalField(max_digits=25,decimal_places=10)
performance = models.DecimalField(max_digits=40,decimal_places=20)
performance_exccy = models.DecimalField(max_digits=40,decimal_places=20)
performance_abs = models.DecimalField(max_digits=40,decimal_places=20)
performance_abs_exccy = models.DecimalField(max_digits=40,decimal_places=20)
date = models.DateField()
def __str__(self):
return self.key
我的观点:
def file_upload(request):
template = "upload.html"
prompt = {
'order': 'Order of the CSV should be "placeholder_1", "placeholder_2", "placeholder_3" '
}
if request.method == "GET":
return render(request, template, prompt)
csv_file = request.FILES['file']
if not csv_file.name.endswith('.csv'):
messages.error(request, 'This is not a csv file')
data_set = csv_file.read().decode('UTF-8')
io_string = io.StringIO(data_set)
#Ignores header row by jumping to next row
next(io_string)
for column in csv.reader(io_string, delimiter=';', quotechar="|"):
# Check if csv-row is empty, if true jump to next iteration/row
if all(elem == "" for elem in column):
next
else:
_, created = Testdata3.objects.update_or_create(
key = column[0],
defaults = {
'key' : column[0],
# Get everything after the date part in the primary key
'mnemonic': re.findall(r'AMCS#[0-9]*(.*)', column[0])[0],
# Create datetime object from a string
'date' : datetime.datetime.strptime(column[6], '%d/%m/%Y'),
'assetclass' : column[10],
'value' : column[16],
'performance' : column[19],
'performance_abs' : column[20],
'performance_abs_exccy' : column[30],
'performance_exccy' : column[31],
}
)
context = {}
return render(request, template, context)
解决方案
我发现了问题:我检查了多个 csv 文件的上传,发现当assetclass
字段包含字符串时总是发生错误Sonstige Vermögensgegenstände
。所以我在视图中注释掉了该assetclass
字段,file_upload
突然我能够将数据导入数据库。错误的原因是资产类字段的 max_length=25 而字符串Sonstige Vermögensgegenstände
的长度为 30 个字符。因此,尽管 django 告诉我问题与该领域有关,但performance_exccy
实际上是由该assetclass
领域引起的。
推荐阅读
- visual-studio-code - 使用 vscode 删除重复的多行
- android - 如何将状态栏颜色更改为十六进制颜色?
- sharepoint - MS Graph 中的端点以获取 SharePoint Online 用户配置文件
- python - Python,f-string将浮点值格式化为精确的小数点
- javascript - 如何有效地制作此 Google Apps 脚本循环?
- php - php 在初始化参数上的表现如何?
- scala - 如何在 Spark (Scala) 中将 WrappedArray[WrappedArray[(String, String)]] 转换为 Array[String]
- python-3.x - 将数据框转换为 Numpy 数组
- r - 按分组变量衡量同比滞后
- unit-testing - Alfresco 中基于 Java 控制器的 Web 脚本的单元测试用例