Django south:访问模型的__unicode __()方法

时间:2015-11-12 21:44:36

标签: python django django-south

在django south数据迁移文件中,如何访问模型的__unicode__()方法?

这是一个简单的例子:

我在models.py中有一个Person类:

class Person(models.Model):
    name = models.CharField(max_length=255)
    def __unicode__(self):
        return self.name

然后我用。创建数据迁移 python manage.py datamigration myapp check_person

在数据迁移文件中,我有

class Migration(DataMigration):
    def forwards(self, orm):
        "Write your forwards methods here."
        for person in orm.Person.objects.all():
            print person

不打印此人的姓名,而是打印

Person object
Person object
...

当我这样做时:

from myapp.models import Person

class Migration(DataMigration):
    def forwards(self, orm):
        "Write your forwards methods here."
        print hasattr(orm.Person, '__unicode__')
        print hasattr(Person, '__unicode__')

打印

False
True

我的问题是那些预期的吗?为什么南方人无法访问__unicode__()方法?我该如何访问它?

修改 执行from myapp.models import Person并直接通过Person.objects.all()访问Person对象对我来说不起作用,因为Person模型将在下一次迁移中从models.py中删除。

1 个答案:

答案 0 :(得分:1)

您可能希望导入原始orm.Person.objects.all()模型并对其进行查询,而不是使用Personorm.PersonPerson不同,它取决于在每个迁移文件末尾定义的大数据结构models,以确定模型信息。

但是,如果您的原始模型已更改,orm.Model仍然有用,这就是为什么南方可以使用有变化的模型,model变量会拍摄模型的快照。 py在创建时。

South doc explains this in details

  南方并没有冻结模型的每个方面;例如,它没有   保留新管理器或自定义模型方法,因为这些需要   序列化运行这些方法的python代码(以及代码   取决于,等等。

编辑:

听起来像OP希望将模型__unicode__属性用于某些目的,但模型将在之后立即删除。由于在这种情况下会出现导入错误,因此我不再需要使用__unicode__,而是建议您使用orm.Model手动访问模型字段来处理此问题(因为__unicode__是无论如何由字段值组成。)