Python 在Django models.py中将.csv字符串数据转换为日期字段类型
我正在Debian 10上使用Python 3.7 我有许多预先存在的.csv文件,其中包含以下列: 名、姓、生日、电话、电子邮件 我正在将它们导入以Django为框架的postgres数据库 我的Django型号:Python 在Django models.py中将.csv字符串数据转换为日期字段类型,python,django,csv,Python,Django,Csv,我正在Debian 10上使用Python 3.7 我有许多预先存在的.csv文件,其中包含以下列: 名、姓、生日、电话、电子邮件 我正在将它们导入以Django为框架的postgres数据库 我的Django型号: from django.db import models class User(models.Model): first_name = models.TextField(blank=False, null=False) last_name = models.Tex
from django.db import models
class User(models.Model):
first_name = models.TextField(blank=False, null=False)
last_name = models.TextField(blank=False, null=False)
birthdate = models.TextField(blank=True, null=True)
phone = models.TextField(blank=False, null=False)
email = models.TextField(blank=False, null=False)
用于导入文件import_users.py的自定义Django管理命令:
class Command(BaseCommand):
def handle(self, *args, **options):
users_file = open(f'{settings.DATA_IMPORT_LOCATION}/users.csv', 'r')
for counter, line in enumerate(users_file):
line_fields = line.split(',')
first_name = line_fields[0]
last_name = line_fields[1]
birthdate = line_fields[2]
phone = line_fields[3]
email = line_fields[4]
u = User()
u.first_name = first_name
u.last_name = last_name
u.birthdate = birthdate
u.phone = phone
u.email = email
u.save()
运行以下Django ORM查询时输出示例:
> for u in User.objects.all():
print(u.birthdate)
输出:
birthdate
2015-05-28
2009-06-14
2007-01-01
2007-02-17
2008-05-16
2013-01-19
2008-07-24
2015-05-01
2007-06-03
2007-01-17
当birthdate=models.TextField设置为TextField时,我可以使用我的管理命令将这些.csv文件成功导入我的Postgres数据库
这是有意义的,因为所有的.csv数据都是字符串
但是,我希望正确地将模型设置为读取日期,即birthdate=models.DateField(),以便进行进一步的计算,例如在特定的时间增量内查找用户的生日
当对DateField进行此更改,然后尝试使用命令./manage.py import\u users将.csv导入数据库时,我收到以下错误:
ValueError:时间数据“生日”与格式“%Y-%m-%d”不匹配
我已尝试使用以下命令将.csv生日数据转换为import_users.py中的datetime对象:
u.birthdate = datetime.datetime.strptime(birthdate, "%Y-%m-%d")
这方面有很多变化,但错误信息是相同的
我认为我不理解如何正确修改给定列的数据。我还将.csv导入代码更改为使用“w”而不是“r”读取
(users\u file=open(f'{settings.DATA\u IMPORT\u LOCATION}/users.csv',w')
)但这没有帮助
当我尝试将models.py字段更改为TextField以外的任何字段时,我遇到了这个问题。同样,这在概念上是有意义的,因为我要求Django处理固有为字符串的预先存在的数据
我不清楚在导入过程中的哪一点我应该修改数据类型以转换为日期、电话号码、生日等的整数
我将非常感谢任何指导,无论是具体的代码行还是对其背后的原则的任何元解释,以便我能够将理解应用于这些和未来的问题
谢谢大家! 我已经使用Django 3.2.2和Postgres docker容器对此进行了测试,我能够简单地保存日期字符串(例如“2007-02-17”),而不需要任何额外的类型转换。检索保存的模型时,Django将日期字段作为datetime.date对象返回
>>> u.birthdate = "2007-02-17"
>>> u.save()
>>> u = TestModel.objects.last()
>>> u.birthdate
datetime.date(2007, 2, 17)
在保存到birthdate之前,您可以尝试打印行字段[2]
的值,以检查是否保存了正确的值
作为旁注,用“w”打开文件没有帮助,因为它将打开一个仅用于写入的文件,这将擦除文件的所有内容。谢谢你,KuroiKuro!这很有帮助。发布后我马上意识到,我要求转换的是标题,而不是下面行中的数据 下面是我最后做的:
with open(f'{settings.DATA_IMPORT_LOCATION}/users.csv', 'r') as users_csv:
users_file = csv.reader(users_csv)
next(users_file) # skip header row
for counter, line in enumerate(users_file):
first_name = line[0]
last_name = line[1]
birthdate = datetime.datetime.strptime(line[2], '%Y-%m-%d')
birthdate = birthdate.strftime('%Y-%m-%d') # to remove the time component
phone = line[3]
email = line[4]
u = User()
u.first_name = first_name
u.last_name = last_name
u.birthdate = birthdate
u.phone = phone
u.email = email
u.save()
您确定日期字符串不包含任何额外字符,如空格、换行符或任何不可打印的字符吗?尝试使用
print(repr(u.birthdate))
来检查这一点。