Преобразование SQL-запроса на создание в модель Django

У меня конкретно проблема со следующими строками:

`created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updated_at` datetime(6) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6),

Вот полный SQL-запрос:

CREATE TABLE `billing_package` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL,
  `start` datetime(6) NOT NULL,
  `expiry` datetime(6) DEFAULT NULL,
  `price` decimal(10,2) NOT NULL,
  `count` int(11) DEFAULT NULL,
  `created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `updated_at` datetime(6) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Django Model

class Package(models.Model):

    name = models.CharField(max_length=200, null=False)
    price = models.CharField(max_length=200, null=False)
    start = models.DateTimeField()
    expiry = models.DateTimeField(null=True)
    price= models.DecimalField(max_digits=10, decimal_places=2)
    count = models.IntegerField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.user

После выполнения миграций с Django, когда я проверяю базу данных, нет значений default для created_at и updated_at? Как правильно сделать следующее в модели Django?

   `created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
   `updated_at` datetime(6) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6),

Как правильно сделать следующее в модели Django?

Не нужно. Django выполняет обработку для получения значения по умолчанию. Таким образом, не установит значение по умолчанию в модели базы данных, но ORM Django обновит поля соответствующим образом.

Однако вы можете реализовать это, сделав raw query в файле миграции. Вы можете создать пустой файл миграции с помощью:

python manage.py makemigrations --empty app_name

Это создаст новый файл в каталоге migrations app_name. Далее вы можете написать необработанный SQL-запрос, изменив файл следующим образом:

# Generated by Django A.B on YYYY-MM-DD HH:MM
from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
        ('app_name', '0123_some_name'),
    ]

    operations = [
        migrations.RunSQL('ALTER TABLE table_name ALTER created_at SET DEFAULT CURRENT_TIMESTAMP(6)'),
        migrations.RunSQL('ALTER TABLE table_name MODIFY updated_at datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6)')
    ]

При этом произойдет обновление базы данных, хотя оно может быть и другим, если вы используете другой диалект SQL.

Вернуться на верх