1

顧客、製品、ドラフトに関する簡単なプログラムを実行しています。

それらは何らかの方法で相互に参照されているため、ある種類のエンティティを削除すると、別の種類の別のエンティティでエラーが発生する可能性があります。

ここに私が持っているものがあります:

-customer.py

class Customer(db.Model):
    """Defines the Customer entity or model."""
    c_name      = db.StringProperty(required=True)
    c_address   = db.StringProperty()
    c_email     = db.StringProperty() ...

-draft.py

class Draft(db.Model):
    """Defines the draft entity or model."""
    d_customer      = db.ReferenceProperty( customer.Customer,
                                        collection_name='draft_set')
    d_address       = db.StringProperty()
    d_country       = db.StringProperty() ...

さて、私がやりたいことは、顧客を削除する前に、顧客を参照するドラフトがあるかどうかを確認することです。これは私が使用しているコードです:

def deleteCustomer(self, customer_key):
    '''Deletes an existing Customer'''

    # Get the customer by its key
    customer = Customer.get(customer_key)

    if customer.draft_set: # (or customer.draft_set.count > 0...)
        customer.delete()

    else:
        do_something_else()

そして今、問題が発生します。選択した顧客で以前に作成したドラフトがある場合、まったく問題はなく、必要な処理を実行します。しかし、その顧客を参照する下書きを作成していない場合、その顧客を削除しようとすると、次のエラーが表示されます。

AttributeError: 'Customer' object has no attribute 'draft_set'

私は何を間違っていますか?彼が collection_name プロパティを「利用可能」にするために、顧客を含むドラフトを常に作成する必要がありますか?

編集:エラーの内容がわかりました。両方のクラスが異なる .py ファイルにあるため、GAE はそのモデルを含むファイルを「通過」するのと同時にエンティティをデータストアにロードするようです。したがって、プログラムを実行していて、そのファイルを使用またはインポートしない場合、データストアはそれまで更新されません。今私がやっていることは次のとおりです。

from draft.py import Draft

「deleteCustomer()」関数内で、最終的には正常に機能していますが、そのため、恐ろしい「使用されていないという警告」が表示されます。

これを修正できる他の方法はありますか?

4

2 に答える 2

1

collection_name プロパティはクエリであるため、常に使用できる必要があります。

不足している可能性があるのはreference_classパラメーターです(参照プロパティのドキュメントを確認してください)

class Draft(db.Model):
"""Defines the draft entity or model."""
    d_customer = db.ReferenceProperty(reference_class=customer.Customer, collection_name='draft_set')

以下が機能するはずです。

if customer.draft_set.count():
    customer.delete()

customer.draft_setこれは生成された Query オブジェクトであるため、常に true を返すことに注意してください。count()

于 2013-03-05T03:33:44.470 に答える
0

考えられる解決策は 2 つあります。

  1. 醜い、悪いもの:私の編集された質問で説明されているように。

  2. ベスト プラクティス:次のような 1 つのファイル (例: models.py) 内にすべてのモデルをまとめます。

    class Customer(db.Model):
    
        """Defines the Customer entity or model."""
    
        c_name      = db.StringProperty(required=True)
        c_address   = db.StringProperty()
        c_email     = db.StringProperty() ...
    
    class Draft(db.Model):
    
        """Defines the draft entity or model."""
        d_customer      = db.ReferenceProperty( customer.Customer,
                                    collection_name='draft_set')
        d_address       = db.StringProperty()
        d_country       = db.StringProperty() ...
    

簡単!

于 2015-05-04T14:33:26.473 に答える