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 に答える