2015-02-24 3 views
3

я следующие моделиКак поддельные миграции для не создавать определенную существующую посредническую таблицу

class VucutBolgesi(models.Model): 
    site = models.ForeignKey(Site) 
    bolge = models.CharField(verbose_name="Bölge", max_length=75) 
    hareketler = models.ManyToManyField("Hareket", verbose_name="Hareketler", null=True, blank=True, help_text="Bölgeyi çalıştıran hareketler") 


class Hareket(models.Model): 
    site = models.ForeignKey(Site) 
    hareket = models.CharField(verbose_name="Hareket", max_length=75) 
    bolgeler = models.ManyToManyField(VucutBolgesi, verbose_name="Çalıştırdığı Bölgeler", null=True, blank=True, 
             help_text="Hareketin çalıştırdığı bölgeler") 

У меня есть один и то же M2M как на столе, так как я хочу, чтобы отобразить такое же промежуточную таблицу на оба администраторе форм. Они также должны использовать одну и ту же таблицу (не создавать две отдельные таблицы), поскольку одно изменение в одной форме администратора должно отражаться на другой. Например, если я добавлю новый Hareket в VucutBolgesi через HareketAdmin, тогда тот же результат будет отображаться также на VucutBolgesiAdmin.

Для этого я сначала удаляю поле hareketler M2M от VucutBolgesi, так что модель Hareketler создаст промежуточную таблицу. Я переношу это, а затем добавьте hareketler в VucutBolgesi с атрибутом db_table, чтобы он распознал ту же промежуточную таблицу.

окончательного вид поля как folows

hareketler = models.ManyToManyField("Hareket", verbose_name="Hareketler", db_table="antrenman_hareket_bolgeler", 
            null=True, blank=True, help_text="Bölgeyi çalıştıran hareketler") 

Когда я пытаюсь перенести это, Джанго броска следующего исключение

django.db.utils.OperationalError: table "antrenman_hareket_bolgeler" already exists 

Как я должен это подделка миграции?

Ниже миграция Джанго создает каждый раз, когда я бег makemigrations

dependencies = [ 
    ('antrenman', '0005_vucutbolgesi_hareketler'), 
] 

operations = [ 
    migrations.AddField(
     model_name='vucutbolgesi', 
     name='hareketler', 
     field=models.ManyToManyField(to='antrenman.Hareket', db_table=b'antrenman_hareket_bolgeler', blank=True, help_text=b'B\xc3\xb6lgeyi \xc3\xa7al\xc4\xb1\xc5\x9ft\xc4\xb1ran hareketler', null=True, verbose_name=b'Hareketler'), 
     preserve_default=True, 
    ), 
] 

Примечания: Редактирование связанного файл перенос и удаление migrations.AddField Ф.О. не работает, так как Джанго создает то же migrations.AddField с каждым makemigrations

ответ

7

Возможно ли, чтобы миграция всегда была поддельной, просто переопределите методы применения и неприменения. Последствия этого недостаточно изучены, но на сегодняшний день это работает для меня.

В следующем примере мы создаем миграцию, которая повторно использует django.contrib.auth.User.group «s M2M таблица b'profile_user_groups:

from __future__ import unicode_literals 

from django.db import migrations, models 


class Migration(migrations.Migration): 

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

    operations = [ 
     migrations.AddField(
      model_name='user', 
      name='organizations', 
      field=models.ManyToManyField(db_column=b'group_id', db_table=b'profile_user_groups', related_name='members', to='profile.Organization'), 
     ), 
    ] 

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

    def unapply(self, project_state, schema_editor, collect_sql=False): 
     return project_state.clone() 
+0

Это жизнь заставка !!! – TAH

3

Решения было настолько просто.

Вы должны быть уверены, что связанная миграция является единственной миграционной операцией, которую нужно подделать. Вы должны сначала создать миграцию с

python manage.py makemigrations antrenman 

Затем примените эту миграцию с --fake

python manage.py migrate --fake antrenman 

Фора, другие разработчики должны знать, что они должны поддельные миграции связаны между собой. Если есть другие миграции наряду с этим, они должны сделать их первыми, а затем подделкой этой.

Слишком плохо, что параметр, указывающий на соответствующую миграцию, не должен быть реальным или поддельным.

 Смежные вопросы

  • Нет связанных вопросов^_^