Как добавить данные по умолчанию в модель 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

Теперь есть несколько способов заполнить таблицу данными.

  1. Свяжите приложение django с базой данных с уже имеющимися строками данных.
  2. Добавьте функцию сериализатора BulkCreate для массового добавления значений.
  3. Используйте оболочку командной строки вручную для создания экземпляров модели, которые будут заполнять таблицу базы данных. Вы можете прочитать об использовании python manage.py shell и python manage.py shellplus.
  4. Используйте сценарий python для добавления данных путем создания экземпляров модели с нужными значениями.

Еще один совет

Вместо использования функции list_data в models.py, использование сериализатора django будет служить большей функциональности и является лучшим способом кодирования.

Идея состоит в том, чтобы сохранить models.py настолько чистым, насколько это возможно, только с определениями атрибутов.

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