变量标识符中的冒号

时间:2013-05-06 08:56:00

标签: python postgis geodjango

变量名中是否可以有冒号? 我已经尝试反斜杠但它不起作用......

我使用的是geoDjango,因此我的模型中的标识符必须与数据库中的标识符保持相同的名称。麻烦的是,当我从OSM迁移数据时,我有一些用冒号命名的列(即addr: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

我真的不明白为什么会收到这个错误。

有人知道如何将列放入标识符中吗?

3 个答案:

答案 0 :(得分:2)

使用db_column字段参数指定您的真实列名称。是的,python中的标识符名称中不允许使用冒号。

class myClass(models.Model):
    addr_housename = models.TextField(blank=True, db_column="addr:housename")

答案 1 :(得分:1)

简短的回答是Python变量名中根本不允许冒号。您只能有字母,数字和下划线。实际上,如果可能的话,你应该用下划线替换所有的冒号。

如果你的变量是类属性 - 这里似乎不是这种情况 - 你可以使用setattrgetattr让类属性名称包含你想要的监视器字符,但是会很难看,如果没有setattrgetattr,你将无法使用它们。这是一个例子:

class A: pass

a = A()
setattr(a, 'addr:housename', models.TextField(blank=True))
some_var = getattr(a, 'addr:housename')

答案 2 :(得分:0)

为什么不定义多个模型并通过外键链接它们就像在实体关系模型中应该做的那样:

class Address(models.Model)
    housename = models.TextField(blank=True)
    ...

class myClass(models.Model):
    address = models.ForeignKey('Address')
    ...