Python 在Django models.py中将.csv字符串数据转换为日期字段类型

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

我正在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.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))
来检查这一点。