Я делаю некоторые обновления в системе, построенной с помощью Django, и теперь у меня возникают проблемы с юга datamigration.Django-south ValueError во время переноса данных
У меня есть модель Cargo, у которой есть внешний ключ для auth.User, и теперь я хочу добавить внешний ключ к другой модели (компании), которая связана с auth.User.
class Cargo(models.Model):
company = models.ForeignKey(
'accounts.Company',
related_name='cargo_company',
verbose_name='empresa',
null=True,
blank=True
)
customer = models.ForeignKey(
'auth.User',
related_name='cargo_customer',
verbose_name='embarcador',
limit_choices_to={'groups__name': 'customer'},
null=True,
blank=True
)
У меня также есть модель UserProfile, которая относится к auth.User и компании, как показано ниже:
class UserProfile(models.Model):
company = models.ForeignKey(
Company,
verbose_name='Empresa',
null=True
)
user = models.OneToOneField('auth.User')
Я создал и запустил schemamigration, чтобы добавить поле компании к грузу, а затем я создал datamigration, чтобы я мог заполнить поле компании всех моих грузов. Что я придумал был такой:
class Migration(DataMigration):
def forwards(self, orm):
try:
from cargobr.apps.accounts.models import UserProfile
except ImportError:
return
for cargo in orm['cargo.Cargo'].objects.all():
profile = UserProfile.objects.get(user=cargo.customer)
cargo.company = profile.company
cargo.save()
Но когда я пытаюсь запустить его, я получаю следующее сообщение об ошибке:
ValueError: Cannot assign "<Company: Thiago Rodrigues>": "Cargo.company" must be a "Company" instance.
Но как вы можете видеть в приведенных выше моделей, оба поля имеют такой же ... Может ли кто-нибудь дать мне свет с этим? Я на Django 1.3.1 и Югом 0.7.3
EDIT: Как спросил ниже, модели UserProfile
и Company
находятся в accounts
модуле и Cargo
находится в cargo
. Так, говоря коротко, у меня есть accounts.UserProfile
, accounts.Company
и cargo.Cargo
Какой модуль является 'UserProfile'? Кажется, вы ссылаетесь на «Компанию» прямо оттуда, но в 'Cargo' вы используете' 'accounts.Company''. У вас есть два класса с тем же именем? – voithos
И 'UserProfile', и' Company' находятся в приложении 'accounts', а' Cargo' находится в приложении 'cargo', поэтому я обращаюсь к' Company' непосредственно в 'UserProfile', а не в 'Cargo' – Thiago
Возможно, это связано с прямым импортом' UserProfile'. Согласно [Южному учебнику по datamigrations] (http://south.readthedocs.org/en/latest/tutorial/part3.html), одним из способов доступа к моделям из разных приложений является использование orm ['someapp.SomeModel'] ', поэтому в вашем случае вы можете сделать' orm ['accounts.UserProfile'] 'вместо' from cargobr ...'. Этот механизм гарантирует, что экземпляры моделей те же, что и при создании переноса данных. – voithos