2015-10-07 3 views
3

я в настоящее время есть несколько моделей, созданных, как это:Как переключить направление Django OneToOneField?

from django.db import models 

class Child(models.Model): 
    child_name = models.CharField(max_length=200) 

class Parent(models.Model): 
    parent_name = models.CharField(max_length=200) 
    child = models.OneToOneField(Child, null=True, blank=True) 

К сожалению, это не так, потому что я хочу удалить на родителя каскаде ребенка, а не наоборот, так что я действительно должен иметь они создали так:

class Parent(models.Model): 
    parent_name = models.CharField(max_length=200) 

class Child(models.Model): 
    child_name = models.CharField(max_length=200) 
    child = models.OneToOneField(Parent) 

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

ответ

3

Прежде всего, добавьте OneToOneField к детской модели, сохраняя исходное поле.

class Parent(models.Model): 
    parent_name = models.CharField(max_length=200) 
    child = models.OneToOneField('Child', null=True, blank=True, related_name='+') 

class Child(models.Model): 
    child_name = models.CharField(max_length=200) 
    parent = models.OneToOneField(Parent, null=True, blank=True, related_name='+') 

Я установил связанное имя = '+', чтобы обратные отношения не столкнулись с другим полем. Вы можете обнаружить, что перенос данных проще, если вы укажете родственное имя для одного или обоих полей.

Создайте миграцию для нового поля.

Затем создайте data migration, чтобы заполнить новое поле.

Наконец, удалите старое поле и создайте новую миграцию.

+0

Спасибо, что в значительной степени сработало. Единственный улов заключается в том, что 'Parent' ссылается на' Child' до 'Child', поэтому мне пришлось ссылаться на него как на строку:' child = models.OneToOneField ('Child', null = True, blank = True, related_name == '+') '. По какой-то причине мне все еще не удается переименовать поля обратно в исходные значения, а также удалить «null = True», но я могу обойти это, так что пока это достаточно хорошо. – clwainwright

+0

Хорошая точка, использующая строку для ''Child'', я исправил пример выше. Удаление «null = True» из нового поля должно работать, если вы сначала заполнили все значения. – Alasdair

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