变量标识中的冒号
问题描述:
变量名中是否可以冒号? 我已经试图反斜杠,但它不工作...变量标识中的冒号
我使用geoDjango,所以我的模型中的标识符必须保持与数据库中的标识符相同的名称。麻烦的是,当我从OSM迁移数据,我有一些列其间用冒号命名(即地址:housenumber)
下面是一个例子:
class myClass(models.Model):
# ...
addr:housename = models.TextField(blank=True)
当我试图执行syncdb :
addr:housename = models.TextField(blank=True)
^
SyntaxError: invalid syntax
这似乎正常。当我试图逃跑结肠,我有另一个错误:
addr\:housename = models.TextField(blank=True)
^
SyntaxError: unexpected character after line continuation character
我真的不明白,为什么我得到这个错误。
有人知道如何把列标识符?
答
使用db_column
字段参数指定您的实际列名称。是的,冒号不允许在Python中的标识符名称。
class myClass(models.Model):
addr_housename = models.TextField(blank=True, db_column="addr:housename")
答
简而言之,冒号在Python变量名中是不允许的。你只能有字母,数字和下划线。其实,如果可能的话,你应该用下划线代替所有冒号。
如果变量是类属性 - 它似乎并没有被这里的情况 - ,你可以使用setattr
和getattr
有class属性,你在里面要wathever角色的名字,但是这将是丑陋的,你赢了如果没有setattr
和getattr
,就无法使用它们。这里有一个例子:
class A: pass
a = A()
setattr(a, 'addr:housename', models.TextField(blank=True))
some_var = getattr(a, 'addr:housename')
答
你为什么不通过外键定义多个模型和链接它们,就像你应该在实体关系模型做什么:
class Address(models.Model)
housename = models.TextField(blank=True)
...
class myClass(models.Model):
address = models.ForeignKey('Address')
...
效果很不错,谢谢:) – Kobz 2013-05-06 12:00:24