2013-02-19 2 views
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 «доступно»?

EDIT: Я выяснил, какова была ошибка. Поскольку у меня есть оба класса в разных .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() ... 
    

Easy!

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 всегда возвращает истину, как это генерируется Объект запроса, поэтому вы ДОЛЖНЫ использовать count()