在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中删除。
答案 0 :(得分:1)
您可能希望导入原始orm.Person.objects.all()
模型并对其进行查询,而不是使用Person
。 orm.Person
与Person
不同,它取决于在每个迁移文件末尾定义的大数据结构models
,以确定模型信息。
但是,如果您的原始模型已更改,orm.Model
仍然有用,这就是为什么南方可以使用有变化的模型,model
变量会拍摄模型的快照。 py在创建时。
South doc explains this in details
南方并没有冻结模型的每个方面;例如,它没有 保留新管理器或自定义模型方法,因为这些需要 序列化运行这些方法的python代码(以及代码 取决于,等等。
听起来像OP希望将模型__unicode__
属性用于某些目的,但模型将在之后立即删除。由于在这种情况下会出现导入错误,因此我不再需要使用__unicode__
,而是建议您使用orm.Model
手动访问模型字段来处理此问题(因为__unicode__
是无论如何由字段值组成。)