django-south — правильный способ понижения уровня зависимостей?

#django #django-models #django-south

#django #django-модели #django-юг

Вопрос:

Я создаю приложение с использованием django и использую django-south для миграции схемы базы данных. Я использую django-mptt для создания системы комментариев, и я установил 0.5-pre (текущую главную ветку git).

В версии, которую я использую, есть вызываемое поле django TreeForeignKey , но я пытаюсь проверить, есть ли в версии 0.5 ошибка, которая существует в версии 0.4, поэтому я удалил свою версию django-mptt и установил текущую версию из cheeseshop. Я изменил свой код, чтобы использовать ForeignKey , а не TreeForeignKey .

Когда приходит время выполнять миграции, это, очевидно, прерывается этим сообщением:

 ValueError: Cannot import the required field 'mptt.fields.TreeForeignKey'
  

Все мои файлы миграции ссылаются mptt.fields.TreeForeignKey на то, что не существует в django-mptt 0.4.

Моя Comment модель в django-mptt 0.5:

 from mptt.models import MPTTModel
from mptt.fields import TreeForeignKey

class Comment(MPTTModel):
    # ...
    parent = TreeForeignKey('self', related_name='children', blank=True, null=True)
  

Та же модель после того, как я понизил до django-mptt 0.4

 import django.db.models
from mptt.models import MPTTModel

class Comment(MPTTModel):
    # ... cruft
    # TreeForeignKey does not exist in mptt 0.5!
    parent = models.ForeignKey('self', related_name='children', blank=True, null=True) 
  

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

  1. Добавьте TreeForeignKey класс в мою установку django-mptt.
  2. Измените мои файлы миграции, чтобы удалить ссылки на mptt.fields.TreeForeignKey .

Я выбрал первый подход, и он сработал, но я чувствую, что это своего рода взлом (но не так сильно, как второй вариант).

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

Ответ №1:

Это действительно не имеет никакого отношения к Югу. fields модуль django-mptt не существовал до версии 0.5.pre. Итак, когда вы понизили рейтинг до 0.4, теперь вы по праву получаете ImportError.

Я не могу сказать вам, какой правильный импорт использовать, потому что я не использую 0.4, и по какой-то сумасшедшей причине разработчики не поддерживали документы 0.4. Однако ваш второй подход кажется наиболее подходящим. Не должно быть никаких причин, по которым вам действительно нужно использовать TreeForeignKey при миграции. Это просто оболочка вокруг стандартного внешнего ключа.

Комментарии:

1. Да, южная часть была немного ортогональной, но поскольку мои модели изменились, и миграции прервались из-за отсутствия материала, все ломалось. Хотя мой маленький эксперимент также не был связан с изменением версии, поэтому я вернулся к django-mptt github-master версии. Спасибо!

2. Возникла та же проблема, и ее решили с помощью второго подхода: заменили все вхождения mptt.fields. TreeForeignKey для django.db.models. поля.связанные. ForeignKey.