2013-02-19 35 views
1

我在做一個關於客戶,產品和草稿的簡單程序。如何獲取沒有引用對象的實例的collection_name?

由於它們以某種方式相互引用,所以當我刪除某種實體時,另一種實體可能會發生錯誤。

這是我有:

-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()」函數,它的最後工作正常,但我得到一個可怕的「警告不使用」的,因爲這樣。

有沒有其他辦法可以解決這個問題?

回答

0

有兩種可能的解決方案:

  1. 醜陋的,壞的:在我的編輯問題描述。

  2. 最佳實踐:把所有車型一起一個文件(例如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() ... 
    

輕鬆!

1

collection_name屬性是一個查詢,所以它應該始終可用。

你可能會丟失是reference_class參數(檢查ReferenceProperty docs

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將始終返回true,因爲它是生成的查詢對象,所以你必須使用count()

相關問題