Django South:访问模型的 __unicode__() 方法

Django south: access model's __unicode__() method

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

这是一个简单的例子:

我在 models.py 中有一个人 class:

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

我的问题是那些是预期的吗?为什么 south orm 不能访问 __unicode__() 方法?我怎样才能访问它?

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

您可能想要导入原始 Person 模型并查询该模型,而不是使用 orm.Person.objects.all()orm.PersonPerson不是一回事,它有点依赖于每个迁移文件末尾定义的大数据结构models来计算模型信息。

但是,如果您的原始模型已更改,orm.Model 仍然可以使用,这就是为什么 south 可以使用有更改的模型,model 变量拍摄 [=33= 的快照] 创建时。

South doc explains this in details.

South doesn’t freeze every aspect of a model; for example, it doesn’t preserve new managers, or custom model methods, as these would require serialising the python code that runs those method (and the code that depends on, and so forth).

编辑:

听起来 OP 想将模型 __unicode__ 属性 用于某些目的,但模型将在之后立即删除。由于在这种情况下会发生导入错误,我不会再使用 __unicode__,而是建议通过使用 orm.Model 手动访问模型字段来处理这个问题(因为 __unicode__ 由无论如何字段值)。