2013-07-11 2 views
3

Я делаю некоторые обновления в системе, построенной с помощью 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

+0

Какой модуль является 'UserProfile'? Кажется, вы ссылаетесь на «Компанию» прямо оттуда, но в 'Cargo' вы используете' 'accounts.Company''. У вас есть два класса с тем же именем? – voithos

+0

И 'UserProfile', и' Company' находятся в приложении 'accounts', а' Cargo' находится в приложении 'cargo', поэтому я обращаюсь к' Company' непосредственно в 'UserProfile', а не в 'Cargo' – Thiago

+0

Возможно, это связано с прямым импортом' UserProfile'. Согласно [Южному учебнику по datamigrations] (http://south.readthedocs.org/en/latest/tutorial/part3.html), одним из способов доступа к моделям из разных приложений является использование orm ['someapp.SomeModel'] ', поэтому в вашем случае вы можете сделать' orm ['accounts.UserProfile'] 'вместо' from cargobr ...'. Этот механизм гарантирует, что экземпляры моделей те же, что и при создании переноса данных. – voithos

ответ

0

Там может быть несоответствие между модельными версиями, которые вы используете, потому что вы импортированы непосредственно:

from cargobr.apps.accounts.models import UserProfile 

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

class Migration(DataMigration): 

def forwards(self, orm): 
    for cargo in orm['cargo.Cargo'].objects.all(): 
     profile = orm['accounts.UserProfile'].objects.get(user=cargo.customer) 
     cargo.company = profile.company 
     cargo.save() 
+1

Спасибо! Мне нужно было сделать еще одну вещь для этого: мне пришлось повторно создать datamigration, на этот раз с параметром '--freeze accounts', чтобы включить эту модель в перенос. Тогда это сработало отлично! – Thiago

+0

@Thiago: Отлично! И добро пожаловать в Stack Exchange! – voithos

+0

Привет, уже давно это использовал, но совсем недавно я начал задавать вопросы .. Надеюсь, я смогу помочь другим людям в будущем – Thiago

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