【问题标题】:Django, South and the --freeze commandDjango、South 和 --freeze 命令
【发布时间】:2011-06-03 14:48:29
【问题描述】:

我正在尝试开始进行 South 数据迁移。我发现了这个 SO 问题:South data migration 'instance' error when using south freeze orm,并尝试了那里列出的命令,但似乎没有帮助。

我的项目中有 2 个应用 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'

我是不是做错了什么?

提前感谢您的帮助!

【问题讨论】:

    标签: python django orm freeze django-south


    【解决方案1】:

    行:

    orm['hr_manager.Employee']
    

    访问Model,而不是实例。您需要通过通常的方式访问实例:

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

    方法。

    【讨论】:

    • 确实,这很好用。 for t in orm.Task.objects.all(): t.age = calculate_age(t.assigned_to.birthdate) t.save() 谢谢@dlamotte。 :)
    猜你喜欢
    • 2012-08-13
    • 2014-02-11
    • 2011-05-12
    • 2012-04-10
    • 2014-01-30
    • 1970-01-01
    • 2011-09-28
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多