Django 1.8 将日期字段更改为日期时间字段

4

我使用的是Django 1.8版本。

我有一个model.py文件,内容如下:

class Product(models.Model):

    name = models.CharField(max_length=150)
    created_at = models.DateField(auto_now_add = True)
    modified_at = models.DateField(auto_now = True)

MySQL有一个名为"created_at"和"modified_at"的表格,其中的数据格式如下:"2015-11-02"。我想要将其改成"2015-11-02 14:54:22"。

我将models.py文件修改为以下内容:

class Product(models.Model):

    name = models.CharField(max_length=150)
    created_at = models.DateTimeField(auto_now_add = True)
    modified_at = models.DateTimeField(auto_now = True)

然后我在控制台中运行迁移。
python manage.py makemigrations
python manage.py migrate

但是什么都没有发生。MySQL表中的数据并没有改变,当我添加新信息时,MySQL仍然按照旧模式“2015-11-02”添加时间。

我该如何修改它们?

PS致Lego Stormtroopr

谢谢,我阅读了Django教程,并编写了这段代码。

from __future__ import unicode_literals
from django.db import migrations, models
import datetime

def add_time_to_date(apps, schema_editor):
    datetables = apps.get_model("product", "Product")
    delta = datetime.timedelta(hours=1)
    for x in datetables.objects.all():
        x.created_at = x.created_at + delta
        x.modified_at = x.modified_at + delta
        x.save()


class Migration(migrations.Migration):
    dependencies = [
        ('product', '0003_auto_20151110_1726'),
    ]

    operations = [
        migrations.RunPython(add_time_to_date),
     ]

之后,我运行。
   python manage.py migrate

控制台输出了以下内容:

    Operations to perform:
      Synchronize unmigrated apps: staticfiles, messages
      Apply all migrations: admin, contenttypes, product, auth, sessions
    Synchronizing apps without migrations:
      Creating tables...
        Running deferred SQL...
      Installing custom SQL...
    Running migrations:
      Rendering model states... DONE
      Applying product.0004_auto_20151110_1821.../home/djangojunior2/virtualpython2/lib/python2.7/site-packages/django/db/models/fields/__init__.py:1414: RuntimeWarning: DateTimeField Product.created_at         received a naive datetime (2015-11-02 00:00:00) while time zone support is active.
      RuntimeWarning)

    /home/djangojunior2/virtualpython2/lib/python2.7/site-packages/django/db/backends/mysql/base.py:124: Warning: Data truncated for column 'modified_at' at row 1
      return self.cursor.execute(query, args)

    /home/djangojunior2/virtualpython2/lib/python2.7/site-packages/django/db/models/fields/__init__.py:1414: RuntimeWarning: DateTimeField Product.created_at received a naive datetime (2015-11-08 00:00:00) while time zone support is active.
      RuntimeWarning)

    /home/djangojunior2/virtualpython2/lib/python2.7/site-packages/django/db/models/fields/__init__.py:1414: RuntimeWarning: DateTimeField Product.created_at received a naive datetime (2015-11-09 00:00:00) while time zone support is active.
      RuntimeWarning)

    /home/djangojunior2/virtualpython2/lib/python2.7/site-packages/django/db/models/fields/__init__.py:1414: RuntimeWarning: DateTimeField Product.created_at received a naive datetime (10 00:00:00) while time zone support is active.
      RuntimeWarning)

     OK

我检查了Mysql数据库(使用mysql-console),但没有发生任何事情。日期仍然是“2015-11-02”。如果我添加新数据,在表格的modified_at和created_at中,日期会以旧格式(“2015-11-02”)添加。

我做错了什么?


你把这段代码放在哪里了? - James Mertz
1个回答

2
migrate 命令只处理 schema 迁移,而不是数据迁移。问题的一部分在于许多数据库后端将日期和日期时间存储在同一字段类型中,而是 Django 将它们强制转换为正确的类型。
因此,您需要进行数据迁移
您的迁移代码将类似于以下内容,但这取决于要添加到无时间日期的时间:
from django.db import models, migrations

def date_to_datetime(apps, schema_editor):
    # We can't import the Person model directly as it may be a newer
    # version than this migration expects. We use the historical version.
    Product = apps.get_model("yourappname", "Product")
    for product in Product.objects.all():
        # convert a date to a date time on the product instance
        product.save()

class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', 'migration_name'),
    ]

    operations = [
        migrations.RunPython(date_to_datetime),
    ]

你好。我编写了我的代码迁移,但没有任何反应。我将我的代码添加到问题后PS。 - volos
你好。我检查了数据库。我的代码运行良好,但之后需要更改表的类型,可以通过mysql控制台、phpmyadmin或其他工具进行操作。非常感谢。 - volos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接