Автоматична фалшива миграция на Django

Трябва автоматично да фалшифицирам миграция на Django 1.9. Има ли флаг, който може да постави във файла за миграция, който автоматично ще фалшифицира, вместо да се налага да влизате в множество сървъри и да стартирате.

Оформлението на миграциите е такова

migtarions
    |-- 0001_initial.py
    |-- 0002.py
    |-- 0003.py

Знам, че мога да направя ./manage.py my_app migrate 0002 --fake, но може ли миграцията 0002 да бъде автоматично фалшифицирана? и всичко, което трябва да стартирам, е ./manage.py my_app migrate


person sir_t    schedule 07.03.2018    source източник
comment
Имайте предвид, че Django 1.9 е в края на живота си и не получава актуализации за сигурност. Трябва да опитате да надстроите поне до версия 1.11.x LTS.   -  person Alasdair    schedule 07.03.2018
comment
Можете просто да изтриете operations в Migration от 0002.py и да ги замените с фиктивен, който не прави нищо (или просто да изтриете файла и да коригирате dependencies).   -  person Paulo Almeida    schedule 07.03.2018
comment
Може би трябва да съм малко по-ясна какво трябва да направя. Имам съществуваща таблица, която е част от приложение на трета страна. Пренаписвам модела с някои променени полета. Така 0002.py създава новия модел с мета, препращащ към съществуващата таблица. След това 0003.py извършва актуализации на полето.   -  person sir_t    schedule 07.03.2018
comment
Трябва да изтриете файла за миграции 0002.py и да изпълните отново командата за мигриране.   -  person Fullstack Developer    schedule 10.07.2020


Отговори (2)


Django 1.8+ не прави автоматични фалшиви миграции. Трябва да използвате опцията --fake-initial, за да кажете на Django да фалшифицира първоначалните миграции.

./manage.py migrate --fake-initial

След това можете да зададете initial = True на вашия клас за миграция 0002, за да кажете на Django, че това е първоначална миграция.

class Migration(migrations.Migration):
    initial = True    
    dependencies = [('migrations', '0001_initial')]

Вижте документите за първоначални миграции за повече информация.

person Alasdair    schedule 07.03.2018

Трябваше да направя същото, когато мигрирах от родния потребителски модел на Django към персонализиран в проект на живо със съществуващи миграции. Постигнах го, като замених методите за прилагане/неприлагане:

# -*- coding: utf-8 -*-
# Generated by Django 1.9.13 on 2018-08-13 13:43
from __future__ import unicode_literals

import django.contrib.auth.models
import django.core.validators
from django.db import migrations, models
import django.utils.timezone


class Migration(migrations.Migration):

    dependencies = [
        ('custom', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='User',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('password', models.CharField(max_length=128, verbose_name='password')),
                ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
                ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
                ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 255 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=255, unique=True, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.')], verbose_name='username')),
                ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
                ('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')),
                ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
                ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
                ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
                ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
                ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
                ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
            ],
            options={
                'db_table': 'auth_user',
            },
            managers=[
                ('objects', django.contrib.auth.models.UserManager()),
            ],
        ),
    ]

    def apply(self, project_state, schema_editor, collect_sql=False):
        return project_state

    def unapply(self, project_state, schema_editor, collect_sql=False):
        return project_state
person Ariel    schedule 13.08.2018