2016-11-01 2 views
1

Работала с GAE в течение нескольких месяцев. Это моя первая работа с отношениями «один-ко-многим». Все было хорошо размещено в хранилище данных, пока я не начал с отношений. Это первый. Может кто-нибудь, пожалуйста, помогите мне с этим «сообщением» в хранилище данных? Документы и другие примеры довольно запутанны. Я знаю, что делаю это неправильно. employees=r['Employees'], Я просто хочу простой пост. Если бы вы могли сделать это еще лучше! Я получаю BadValueError при публикации, как показано;GAE размещение массива в хранилище данных с помощью Python (один для многих)

enter image description here

model.py

class Project(ndb.Model): 
    projectID = ndb.IntegerProperty(required=True) 
    title = ndb.StringProperty(required=True) 
    description = ndb.StringProperty(required=True) 
    startAt = ndb.DateTimeProperty(indexed=True) 
    endAt = ndb.DateTimeProperty() 
    employees = ndb.KeyProperty(kind='Employees', repeated=True) 

class Employees(ndb.Model): 
    name = ndb.StringProperty() 
    role = ndb.StringProperty() 

handlers.py

def post(self): 
    r = json.loads(self.request.body) 
    print str(r) 

    g = Project(projectID=int(r['ProjectID']), 
       description=r['Description'], 
       title=r['Title'], 
       employees=r['Employees'], 
       startAt=datetime.strptime(r['StartAt'], '%d/%m/%Y %H:%M %p'), 
       endAt=datetime.strptime(r['EndAt'], '%d/%m/%Y %H:%M %p')) 

    project_key = g.put() 
    project_key.get() 
    print project_key 

controller.js

$scope.employees = [ 
          { 
           name:'mark', 
           role: 'dev' 
          }, 
          { 
           name:'colin', 
           role: 'dev2' 
          }, 
         ]; 

ОБНОВЛЕНИЕ ------------------------------------------- ---------------------------

обработчик JSON

class commentsJsonHandler(webapp2.RequestHandler): 
@classmethod 
def route(cls): 
    """ 
    name: index, template:/
    """ 
    return webapp2.Route('/comments', handler=cls, name='_commments_') 


def get(self): 
    recommendations = Project.query() 

    def date_handler(obj): 
     if isinstance(obj, datetime): 
      return obj.isoformat() 
     else: 
      raise TypeError 

    self.response.out.write(json.dumps([dict(rec.to_dict(), **dict(id=rec.key.id())) for rec in recommendations], default=date_handler)) 

ответ

1

Вы должны перебрать сотрудников собирать в своей полезной нагрузке json и создавать эти лица-сотрудники сначала и использовать их ключи для создания объекта проекта

def post(self): 
    r = json.loads(self.request.body) 
    print str(r) 
    employee_keys = [] 
    for emp in r['Employees']: 
     employee = Employees(name=emp['name'], role=emp['role']) 
     employee.put() 
     employee_keys.append(employee.key) 


    g = Project(projectID=int(r['ProjectID']), 
       description=r['Description'], 
       title=r['Title'], 
       employees=employee_keys, 
       startAt=datetime.strptime(r['StartAt'], '%d/%m/%Y %H:%M %p'), 
       endAt=datetime.strptime(r['EndAt'], '%d/%m/%Y %H:%M %p')) 

    project_key = g.put() 
    project_key.get() 
    print project_key 
+1

Определенно хочу скопировать вам новые сущности сотрудника в списке, а затем выполнить ndb.put_multi() после цикла. Никогда не делайте отдельные put() s в петле, если вы хотите быстрое время отклика. (** никогда не говори никогда) – stevep

+0

@stevep спасибо за дополнительную информацию. Ну, решила @gipsy. Итак, теперь у моего обработчика json возникают проблемы с удалением ключей с помощью json.dumps(), когда я 'self.response.out.write (json.dumps ([rec.to_dict() для rec в рекомендациях], default = date_handler))'. Из 'Project.query()' находится где «рекомендации» идут. Создается 'TypeError'. –

+0

Я добавил обработчик json к вопросу. После редактирования кода, чтобы читать 'key', он перестает распознавать datetimeobjects –

Смежные вопросы