1

我当前的系统要求是我有一个主对象,我有多个行项目,我的数据结构是这样的,我在一个类对象中拥有主信息,每个行项目在不同的类对象中,并将它们存储在数据存储。

因此,为了存储行项目数据,我必须根据用户通过表单数据提交的行项目数从类中创建每个对象。

我正在尝试使用以下代码动态创建对象的名称

(litm+str(i)) = t_det()

其中 t_det() 是我在运行时尝试为其创建名称为 (litm+str(i)) 的对象的类,其中“litm”是常量部分,str(i) 将是名称的动态生成部分我希望像litm1、litm2、litm3、litm4

但是当我使用上面的代码时,我得到了下面的错误,并且不确定如何为我当前的需求获得正确的 Python。

(litm+str(i)) = t_det()
SyntaxError: can't assign to operator

我被困在这里不知道现在如何为我获取正确的python代码,请帮助...

@Tkingovr 要求的类代码

t_det(db.Model):              # Tendet Details table   
td_id = db.StringProperty()     # Tender ID, Master table ref
td_ln = db.IntegerProperty()    # Line Number
td_item = db.StringProperty()   # Item
td_itm_qty = db.FloatProperty() # Number Item Quantity  
td_itm_uom = db.StringProperty()# Unit of the Quantity specified
tr_ln_qt_amt= db.FloatProperty()# Line Quote Amount
tr_ln_app = db.StringProperty() # Line Quote Approved  
4

1 回答 1

0

您是否尝试动态设置实体名称,元素将存储在数据存储中?

使用当前 API 无法直接实现,但我使用了以下解决方法:

classCache = {}
def generateExpandoClass( className ):
    """Creates a new Appengine Expando Class which operates on the collection specified by className.

    @type className: String
    @param className: Name of the collection
    @returns: An Appengine NDB.Expando Class
    """
    global classCache
    if not className in classCache.keys():
            classCache[ className ] = new.classobj( className, ( Expando,), {})
    return( classCache[ className ] )

(完整代码见https://bitbucket.org/viur/server/src/98de79b91778bb9b16e520acb28e257b21091790/utils.py?at=master) 这个函数使用了 New-Module ( http://docs.python.org/2/ library/new.html ) 在运行时创建一个新的 ndb.expando 类,它将其数据保存到给定的实体类。

警告:此方法适用于 ext.db - 因为一切都是使用类完成的(class.all()、class.get()) - 所以它保证当前实例在获取实体时知道类。然而,在 NDB 中,get() 是使用 Key-Class 执行的。如果您在新创建的实例上执行此操作,并且不为您之前尝试获取的类调用 generateExpandoClass,则 NDB 将严重失败。

于 2013-01-03T11:52:57.317 回答