Редактирование файла models.py и перенос изменений в базу данных в том же коде python - PullRequest
2 голосов
/ 11 июля 2020

Я хочу отредактировать файл models.py для приложения, а затем перенести изменения в базу данных (postgreSQL) в том же коде python.

В представлении определение , которое должно выполнить это, я делаю следующее:

  1. Открыть models.py
  2. Добавить новую модель таблицы к существующим моделям
  3. Закройте models.py
  4. Запустите makemigrations
  5. Запустите sqlmigrate
  6. Запустите migrate

Он отлично работает до шага № 3. Модель новой таблицы добавляется в models.py, но makemigrations не принимает последнюю модель, которая была добавлена ​​в models.py.

Фактически, она не принимает последние копии моделей. py для миграций, он использует тот, который существовал ДО вызова представления.

Есть ли способ использовать последний (добавленный с необходимой моделью) файл models.py для команд миграции?

#Here we are attempting to create a user's portfolio table as soon as his registration is complete
            
            #Step1: Adding schema to model.py
            
            modeladdscript = '\n\nclass '+ username + '(models.Model):'
            modeladdscript = modeladdscript + '''
stock_id = models.CharField(max_length = 20)
stock_name = models.CharField(max_length = 100)
qty = models.IntegerField(default = 0)
investment = models.FloatField()
hold = models.CharField(max_length = 50)'''
            
            #Step 2: Getting the location of models.py in fileloc

            fileloc ='portfolio\models.py' #Need to figure out how to get location of portfolio/models.py
            
            #Step 3: Opening models.py and appending the model add script

            with open(fileloc,"a") as f:
                f.write(modeladdscript)
            
            #Step 4: Closing models.py
            f.close()
            #Works absolutely fine till here

            # Make migrations
            call_command('makemigrations')  #This command is not taking the model that has been added above at the time of user creation.

            # Remove all the terminal colors, less parsing later.
            os.environ['DJANGO_COLORS'] = 'nocolor'

            # Capturing the list of applied and unapplied migrations 
            out = StringIO()
            call_command('showmigrations', stdout=out)

            # Clean up the line, and remove all applied migrations
            work = [line.strip() for line in out.getvalue().split('\n') if not line.startswith(' [X]')]
            # Keep looping until we run out of lines.
            while work:
                app_name = work.pop(0)
                while work and work[0].startswith('['):
                    migration_name = work.pop(0)[4:]
                    app_path = apps.get_app_config(app_name).module.__file__
                    # Print the whole path to the migration file that corresponds to this migration
                    print('--', os.path.abspath(os.path.join(app_path, '../migrations/', '{}.py'.format(migration_name))))
                    call_command('sqlmigrate', app_name, migration_name[:8])
            
            # Applying all pending migrations
            call_command('migrate')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...