Django、South和--freeze命令

2 投票
1 回答
2414 浏览
提问于 2025-04-16 18:54

我正在尝试开始使用South进行数据迁移。我找到了一条StackOverflow上的问题:使用south freeze orm时的South数据迁移'实例'错误,并尝试了那里的命令,但似乎没有帮助。

我的项目中有两个应用程序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生成一个数据迁移,这样它就可以计算分配给任务的员工的年龄和资历,并将这些信息存储在任务中。我运行了:

./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'

我是不是做错了什么?

提前感谢你的帮助!

1 个回答

2

这一行代码:

orm['hr_manager.Employee']

是用来访问Model,而不是访问一个具体的实例。你需要通过下面的方式来访问一个实例:

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

方法。

撰写回答