Django попытка добавить существующее поле при создании управляемой модели - PullRequest
0 голосов
/ 19 июня 2020

Как я могу остановить Django 2.2.4 от попытки создать столбец базы данных, который уже существует при создании управляемой модели?

У меня есть 2 модели, билет и сообщение, которые были подключены к таблицам в сторонняя база данных, поэтому модели были созданы с использованием managed=False. Я ухожу от стороннего инструмента. Модель билета была изменена на managed=True некоторое время на go кем-то другим, и теперь я пытаюсь сделать то же самое с моделью сообщения.

Это соответствующие части модели:

from django.db import models

class Message(models.Model):
    mid = models.BigAutoField(db_column='MID', primary_key=True)
    ticket = models.ForeignKey('Ticket', on_delete=models.CASCADE, db_column='TID')
    author = models.CharField(db_column='AUTHOR', max_length=32)
    date = models.DateTimeField(db_column='DATE')
    internal = models.CharField(db_column='INTERNAL', max_length=1)
    isoper = models.CharField(db_column='ISOPER', max_length=1)
    headers = models.TextField(db_column='HEADERS')
    msg = models.TextField(db_column='MSG')

    class Meta:
        # managed = False
        db_table = 'messages'
        permissions = (
            ("can_change_own_worked_time", "Can change own worked time"),
            ("can_change_own_recently_worked_time", "Can change own recently worked time"),
            ("can_change_subordinate_worked_time", "Can change subordinate worked time"),
        )

Это миграции, которые генерируются путем комментирования managed=False:

# Generated by Django 2.2.4 on 2020-06-18 20:56 (0017_auto_20200618_1656)

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('troubleticket', '0016_auto_20200511_1644'),
    ]

    operations = [
        migrations.AlterModelOptions(
            name='message',
            options={'permissions': (('can_change_own_worked_time', 'Can change own worked time'), ('can_change_own_recently_worked_time', 'Can change own recently worked time'), ('can_change_subordinate_worked_time', 'Can change subordinate worked time'))},
        ),
    ]
# Generated by Django 2.2.4 on 2020-06-18 21:14 (0018_message_ticket)

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
        ('troubleticket', '0017_auto_20200618_1656'),
    ]

    operations = [
        migrations.AddField(
            model_name='message',
            name='ticket',
            field=models.ForeignKey(db_column='TID', default=1, on_delete=django.db.models.deletion.CASCADE, to='troubleticket.Ticket'),
            preserve_default=False,
        ),
    ]

Когда я пытаюсь применить эти миграции, я получаю эту ошибку:

django.db.utils.OperationalError: (1060, "Duplicate column name 'TID'")

Первоначальная миграция не включала столбец TID, как и никакие последующие миграции, поэтому я понимаю, почему Django считает, что это новый столбец. Но это не новый столбец (в модели он был с первого раза, когда он был зафиксирован в репозитории git), поэтому я также понимаю, почему MySQL выдает ошибку.

Это начальная миграция:

# Generated by Django 2.0.8 on 2018-08-20 14:43 (0001_initial)

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Message',
            fields=[
                ('mid', models.BigAutoField(db_column='MID', primary_key=True, serialize=False)),
                ('author', models.CharField(db_column='AUTHOR', max_length=32)),
                ('date', models.DateTimeField(db_column='DATE')),
                ('internal', models.CharField(db_column='INTERNAL', max_length=1)),
                ('isoper', models.CharField(db_column='ISOPER', max_length=1)),
                ('headers', models.TextField(db_column='HEADERS')),
                ('msg', models.TextField(db_column='MSG')),
            ],
            options={
                'managed': False,
                'db_table': 'messages',
            },
        ),
        migrations.CreateModel(
            name='Ticket',
            fields=[
                ('id', models.BigIntegerField(db_column='ID', primary_key=True, serialize=False)),
                ('accesskey', models.CharField(db_column='ACCESSKEY', max_length=64)),
                ('open', models.DateTimeField(db_column='OPEN')),
                ('updated', models.DateTimeField(db_column='UPDATED')),
                ('closed', models.DateTimeField(db_column='CLOSED', null=True)),
                ('status', models.CharField(db_column='STATUS', max_length=3)),
                ('oper', models.CharField(db_column='OPER', max_length=32)),
                ('email', models.CharField(db_column='EMAIL', max_length=128)),
                ('name', models.CharField(db_column='NAME', max_length=128)),
                ('subject', models.CharField(db_column='SUBJECT', max_length=255)),
                ('lname', models.CharField(db_column='LNAME', max_length=50)),
                ('company', models.CharField(db_column='C0', max_length=255)),
                ('type', models.CharField(db_column='C1', max_length=255)),
                ('c2', models.CharField(db_column='C2', max_length=255)),
                ('c3', models.DecimalField(db_column='C3', decimal_places=2, max_digits=6)),
                ('c4', models.CharField(db_column='C4', max_length=255)),
                ('pending', models.CharField(db_column='C5', max_length=255)),
                ('c6', models.CharField(db_column='C6', max_length=255)),
                ('c7', models.CharField(db_column='C7', max_length=255)),
                ('c8', models.CharField(db_column='C8', max_length=255)),
                ('cc', models.CharField(db_column='C9', max_length=255)),
                ('grp', models.CharField(db_column='GRP', max_length=10)),
                ('item', models.CharField(db_column='ITEM', max_length=255)),
            ],
            options={
                'managed': False,
                'db_table': 'tickets',
            },
        ),
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...