2013-02-19 60 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()

相关问题