Преобразование 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.