2015-11-27 1 views
0

Я пошел добавлять текстовое поле к модели в своем приложении django, сделал, применил свои миграции, У меня есть тесты, проваливающиеся влево и вправо. Оказывается, миграция решила отказаться от поля, которое все еще существует в моей модели.Почему миграция Django (1.8.3) при миграции происходит, когда они все еще находятся в модели

Прежде чем продолжить, некоторые из соответствующих кода. Во-первых, осуществляется модель:

class CandidateProfile(models.Model): 

    user_profile = models.ForeignKey(UserProfile, related_name="candidate_profile", null=True, blank=True) 
    facebook_url = models.CharField(max_length=200, default="") 
    website = models.CharField(max_length=200, default="") 
    primary_email = models.CharField(max_length=100, default="") 
    party = models.ForeignKey(PoliticalParty, related_name="candidate_party", null=True, blank=True) 
    uploaded_picture = models.CharField(max_length=200, default="") 
    ref_id = models.CharField(db_index=True, max_length=50, default="") 

    create_date = models.DateTimeField(auto_now_add=True) 
    update_date = models.DateTimeField(auto_now=True) 

В поле я добавил был facebook_url. До этой миграции, приложение работы, тесты прохождения и т.д. Миграция, которая была генерируемый:

class Migration(migrations.Migration): 

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

    operations = [ 
     migrations.RemoveField(
      model_name='candidateprofile', 
      name='party', 
     ), 
     migrations.AddField(
      model_name='candidateprofile', 
      name='facebook_url', 
      field=models.CharField(default=b'', max_length=200), 
     ), 
    ] 

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

Мой вопрос: почему Django считает, что поле должно быть удалено, хотя оно явно присутствует в качестве внешнего ключа в модели?

Edit: После поля было удалено, я попытался изменить свойства на атрибуте party, чтобы увидеть, если все, что дифф-кий механизм Django использует будет забрать его. Нет кости, изменение related_name, null, или blank ничего не сделал. Запуск makemigrations не обнаружил никаких изменений.

Кроме того, внешний ключ модель для справки:

class PoliticalParty(models.Model): 

    name = models.CharField(max_length="100") 
    full_name = models.CharField(max_length="255") 
    abbreviation = models.CharField(max_length="20") 
    ref_id = models.CharField(max_length="50", default="", db_index=True) 

    create_date = models.DateTimeField(auto_now_add=True) 
    update_date = models.DateTimeField(auto_now=True) 

ответ

1

Я предполагаю, что вы «слежка» поле, создавая атрибут или метод с тем же именем.

class CandidateProfile(models.Model): 
    party = models.ForeignKey(PoliticalParty, related_name="candidate_party", null=True, blank=True) 

    def party(self): 
     """This method will replace the model field""" 
     return '' 

Если вы не сделаете это, то, пожалуйста, попробуйте предоставить инструкции, которые могут воссоздавать вопрос (желательно с последней версией 1.8.7 точки). Удаление существующего поля - очень серьезная проблема с потерей данных, и разработчики Django воспримут это очень серьезно.

+0

Yup, это как раз то, что я сделал. Обновлено мое соглашение об именах для методов getter и больше проблем. Спасибо, это меня заводило. – west1737

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