2011-06-03 37 views
2

我試圖開始南數據遷移。我發現這個問題:South data migration 'instance' error when using south freeze orm,並嘗試列出的命令,但它似乎沒有幫助。Django,South和--freeze命令

我有兩個應用程序A和B在我的項目,這裏有他們的模型:

# /app_A/models.py 
from django.db import models 
class Employee(models.Model): 
    name = models.CharField(max_length = 100) 
    department = models.ForeignKey("Department") 
    manager = models.ForeignKey("self", blank = True, null = True) 
    birthdate = models.DateField() 

# /app_B/models.py 
from django.db import models 
from hr_manager.models import Employee 
class Task(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.TextField() 
    assigned_to = models.ForeignKey(Employee, null=False, blank=False) 
    seniority = models.IntegerField(default=0) 
    age = models.IntegerField(default=0) 

我試圖生成APP_B數據遷移,使其計算員工工作的年齡和senority被分配並存儲在任務本身中。我跑了:

./manage.py datamigration app_B populate_age_and_senority --freeze app_A 

--freeze選項應該使app_A的模型在通過orm ['app_1。']進行遷移時可用。然後我編輯創建這樣的遷移:

from south.db import db 
from south.v2 import DataMigration 
from django.db import models 
class Migration(DataMigration): 
def forwards(self, orm): 
    import datetime 
    def calculate_age(born): 
     ''' Returns the age from a starting date ''' 
     ... 
    birthdate = orm['hr_manager.Employee'].birthdate 
    date_joined = orm['hr_manager.EmployeeHistory'].date_joined 
    orm.Task.age = calculate_age(birthdate) 
    orm.Task.seniority = calculate_age(date_joined) 
    orm.Task.save() 
def backwards(self, orm): 
    raise RuntimeError("Cannot reverse this migration.") 

然後跑去:

./manage.py migrate app_B 

這是我獲得的:

AttributeError: type object 'Employee' has no attribute 'birthdate' 

難道我做錯了什麼?

在此先感謝您的幫助!

回答

2

線:

orm['hr_manager.Employee'] 

訪問的Model,不是一個實例。您需要通過以下方式訪問實例:

orm['hr_manager.Employee'].objects.all() 
orm['hr_manager.Employee'].objects.get(...) 
... 

方法。

+0

確實,這工作得很好。 謝謝@dlamotte。 :) – 2011-06-03 15:13:42