Как добавить данные по умолчанию в модель django
У меня есть веб-приложение со следующей моделью
class Records(models.Model):
alias = models.CharField(max_length=17, unique=True)
status = models.BooleanField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.alias
def list_data(self):
return [self.alias, self.status, self.created_at, self.updated_at]
I want some default data to be populated into this model on creation. I went through the documentation and this StackOverflow question for doing the same.
Сначала я выполнил эту команду для создания файла миграций (0001_initial.py)
python manage.py makemigrations --empty main_app
Затем я отредактировал файл миграций следующим образом
0001_initial.py
# Generated by Django 4.0.3 on 2022-04-23 05:57
from django.db import migrations
def add_initial_data(apps, schema_editor):
Records = apps.get_model('main_app', 'Records')
for record in Records.objects.all():
record.alias = f'ACCORD1'
record.status = True
record.save()
for i in range(2,6):
record.alias = f'ACCORD{i}'
record.status = False
record.save()
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.RunPython(add_initial_data)
]
Когда я запускаю миграции с помощью следующей команды
python manage.py migrate
Я получаю следующую ошибку
LookupError: No installed app with label 'main_app'.
Я попробовал добавить зависимость в файл миграций следующим образом
dependencies = [
('main_app', '0001_initial')
]
Но это дает мне следующую ошибку
django.db.migrations.exceptions.CircularDependencyError: main_app.0001_initial
Я не уверен, что делаю неправильно.
CircularDependencyError
Ошибка круговой зависимости возникает, когда вызываемый файл связан с зависимостью, которая имеет вызываемый файл в качестве своей зависимости.
В файле main_app/001_initial.py вы добавили зависимость main_app/001_initial.py, добавив строку:
dependencies = [
('main_app', '0001_initial')
]
При миграции возникает путаница, импортировать ли файл main_app/001_initial.py или зависимость main_app/001_initial.py, зависимостью которой является файл main_app/001_initial.py.
Таким образом, создается круговая схема зависимостей.
Добавление значений по умолчанию.
Добавление нескольких строк данных из файла миграции не является частью хорошей парадигмы кодирования. Вам лучше использовать другой метод.
Добавьте значения по умолчанию в саму модель.
Эти значения помогут добавить значения по умолчанию только при сохранении одного экземпляра за раз.
class Records(models.Model):
alias = models.CharField(max_length=17, unique=True, default="ACCORD")
status = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.alias
Теперь есть несколько способов заполнить таблицу данными.
- Свяжите приложение django с базой данных с уже имеющимися строками данных.
- Добавьте функцию сериализатора BulkCreate для массового добавления значений.
- Используйте оболочку командной строки вручную для создания экземпляров модели, которые будут заполнять таблицу базы данных. Вы можете прочитать об использовании
python manage.py shellиpython manage.py shellplus. - Используйте сценарий python для добавления данных путем создания экземпляров модели с нужными значениями.
Еще один совет
Вместо использования функции list_data в models.py, использование сериализатора django будет служить большей функциональности и является лучшим способом кодирования.
Идея состоит в том, чтобы сохранить models.py настолько чистым, насколько это возможно, только с определениями атрибутов.