BadValueError:属性X必须是str或unicode实例,而不是元组(更新时,不是创建时)

时间:2012-10-05 09:43:03

标签: python google-app-engine google-cloud-datastore webapp2

GAE让我发疯了。

我有以下内容:

    if id_puertas[x]:
        puerta = Puerta.get_by_id(int(id_puertas[x]))
        puerta.ubicacion = ubicacion_puertas[x],
        puerta.ancho = float(ancho_puertas[x]),
        puerta.marco = float(marco_puertas[x]),
        puerta.alto  = float(alto_puertas[x]),
        puerta.giro  = giro_puertas[x],
        puerta.condena = True if condena_puertas[x] == 'Si' else False,
        puerta.extra = extra_puertas[x]
    else:
        puerta = Puerta(
            medicion = medicion.key().id(),
            ubicacion = ubicacion_puertas[x],
            ancho = float(ancho_puertas[x]),
            marco = float(marco_puertas[x]),
            alto  = float(alto_puertas[x]),
            giro  = giro_puertas[x],
            condena = True if condena_puertas[x] == 'Si' else False,
            extra = extra_puertas[x]
        )
    puerta.put()

同一表单将id_puerta作为数字发送,或发送空白。如果是数字,则更新数据存储区中的实体。如果它是空白的,则创建一个新实体。

创作完美无缺。

但是,如果我重新发送相同的表单(即使没有修改),更新会在第一次分配时阻塞。

ubicacion_puertas[x]是一个字符串(创建时的字符串与更新时相同),puerta.ubicacionStringProperty,但我收到以下错误:

 BadValueError: Property ubicacion must be a str or unicode instance, not a tuple

在调试器中,我清楚地看到ubicacion_puertas[0]是u'Salon'。所以我无法理解这个错误。

1 个答案:

答案 0 :(得分:4)

当你这样做时:

puerta.ubicacion=ubicacion_puertas[x],

您将元组存储在ubicacion的{​​{1}}属性中:另一种更易读的形式是:

puerta

你确定这是你想要的吗?只需摆脱puerta.ubicacion=(ubicacion_puertas[x],) 来存储str

,

(其他属性也一样......)