python в Google App Engine - проблема с классом вместо экземпляра, но с использованием db.Model, поэтому невозможно создать метод init - PullRequest
1 голос
/ 28 декабря 2010

Я пишу приложение для сравнения продуктов, используя Python и GAE.Продукты будут принадлежать к набору похожих продуктов, и приложение рассчитывает наилучшее значение в каждом наборе.

Когда я создаю новый продукт, его можно добавить в существующий набор или создать новый набор.

При тестировании приложения первый набор создается очень хорошо.Я заполняю экземпляр набора названием продукта.Я использую форму на одной веб-странице, чтобы разместить данные на странице "Suppbook".Я до сих пор не понимаю, как веб-страница может быть классом, но это другой вопрос.

Вокруг всего этого есть код, но я пытаюсь сделать свой вопрос максимально понятным.

class Supp(db.Model):
    name             = db.StringProperty(multiline=False)
    # a bunch of other attributes using Google's DB Model

class SuppSet(db.Model):
    name       = db.StringProperty(default='')
    supp_list  = set([])
    # a bunch of other attributes using Google's DB Model        

    # i tried to add this after reading a few questions on SO but GAE doesn't like it
    def __init__(self,):
       self.name       = 'NoName'
       self.best_value = 'NoBestValue'
       self.supp_list  = set([])

Class Suppbook(webapp.RequestHandler):
def post(self):
    supp             = Supp()
    suppSet          = SuppSet()
...
    supp.name          = self.request.get('name')
    supp.in_set        = self.request.get('newset')
    suppSet.name       = supp.in_set
    suppSet.supp_list.add(supp.name)
    self.response.out.write('%s now contains %s<p>' % (suppSet.name,suppSet.supp_list))

Это хорошо работает в первый раз, и если я использую только один SuppSet, я могу добавить к нему много глотков.Если я создам еще один SuppSet, то оба suppSets будут иметь одинаковое содержимое для своих supp_list.Я просматривал вопросы здесь и думаю (знаю), что я делаю что-то не так в отношении доступа к атрибутам класса и экземпляра.Я пытался создать __init__ метод для SuppSet, но GAE пожаловался: AttributeError: у объекта SuppSet нет атрибута _entity

Кроме того, я использую хранилище данных GAE дляput () и get () Supps и SuppSets, поэтому я не понимаю, почему я не обращаюсь к уникальным экземплярам, ​​которые я должен извлекать из БД.

Я не уверен, если япредоставить достаточно информации, но я хотел бы начать по этому вопросу.Пожалуйста, дайте мне знать, если нужна дополнительная информация, чтобы помочь отладить это.

Я также открыт для идеи, что я делаю это совершенно неправильно.Я подумываю о переписывании всего этого, но я настолько близок к тому, чтобы «закончить» с основными функциями, и я хотел бы попытаться решить эту проблему.

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 декабря 2010

В вашем коде есть некоторые (я полагаю) опечатки. Python чувствителен к регистру и пробелам. Используемые вами имена атрибутов также не соответствуют вашим определениям, таким как in_set. По возможности публикуйте реальные рабочие примеры, демонстрирующие вашу проблему.

class Supp(db.Model):
    name = db.StringProperty(multiline=False)
    in_set = db.StringProperty(multiline=False)
    # your other stuff ...

class SuppSet(db.Model):
    name       = db.StringProperty(default='')
    supp_list  = db.StringListProperty()
    # your other stuff ...

    # In Python, you need to explicitly call the parent's __init__ with your args.
    # Note that this is NOT needed here.
    def __init__(self, **kwargs):
       db.Model.__init__(self, **kwargs)


class Suppbook(webapp.RequestHandler):
    def post(self):
        # This will create a NEW Supp and SuppSet every request,
        # it won't fetch anything from the datastore.
        # These are also NOT needed (included for explanation)
        supp = Supp()
        suppSet = SuppSet()

        # It sounds like you want something like:
        product_name = self.request.get('name')
        product_set = self.request.get('newset')

        # check for missing name / set:
        if not product_name or not product_set:
           # handle the error 
           self.error(500)
           return

        # Build the keys and batch fetch.
        supp_key = db.Key.from_path('Supp', product_name)
        suppset_key = db.Key.from_path('SuppSet', product_set)
        supp, suppset = db.get([supp_key, suppset_key])
        if not supp:
             supp = Supp(key_name=product_name,
                         name=product_name)

        if not suppset:
             suppset = SuppSet(key_name=product_set,
                               name=product_set)

        # Update the entities
        supp.in_set = product_set
        if product_name not in suppset.supp_list:
            suppset.supp_list.append(product_name)

        # Batch put...
        db.put([supp, suppset])


        self.response.out.write('%s now contains %s<p>' % (suppset.name, str(suppset.supp_list)))
0 голосов
/ 28 декабря 2010

В вашем init вам нужно будет позвонить суперу init , в db.Model есть несколько важных вещей, которые нужно сделать в init , вам нужно будетсопоставьте подпись.

Однако вам, скорее всего, не следует настраивать такие параметры, как значения по умолчанию.Попробуйте просто использовать свойство «Свойства хранилища данных», чтобы установить значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...