GAE使用Python将数组发布到数据存储(一对多)

GAE使用Python将数组发布到数据存储(一对多),python,angularjs,google-app-engine,webapp2,Python,Angularjs,Google App Engine,Webapp2,与GAE合作了几个月。这是我第一次在这里处理一对多的关系。在我开始处理关系之前,一切都很好地发布到了数据存储中。这是第一个。有人能帮我把这篇文章发到数据存储吗?文档和其他示例目前相当混乱。我知道我做得不对,我只想先发一篇简单的帖子。如果你能把它弄得更好!如图所示,我在发布时收到一个BadValueError model.py class Project(ndb.Model): projectID = ndb.IntegerProperty(required=True) titl

与GAE合作了几个月。这是我第一次在这里处理一对多的关系。在我开始处理关系之前,一切都很好地发布到了数据存储中。这是第一个。有人能帮我把这篇文章发到数据存储吗?文档和其他示例目前相当混乱。我知道我做得不对,我只想先发一篇简单的帖子。如果你能把它弄得更好!如图所示,我在发布时收到一个BadValueError

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()
 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
handlers.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()
 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))

您必须迭代json负载中的employees集合,首先创建这些employees实体,然后使用它们的键创建项目实体

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

肯定要在列表中累积新员工实体,然后在循环后执行ndb.put_multi()。如果您想要快速响应时间,请不要**将单个put()放入循环中。(**永不说永不)@stevep谢谢你的额外洞察力。很好地解决了吉卜赛人的问题。因此,现在我的json处理程序在我
self.response.out.write(json.dumps([rec.to_dict(),对于rec-in-recommendations],default=date_-handler])时出现了使用json.dumps()转储键的问题。
。来自
Project.query()
推荐的来源。出现了一个
TypeError
。我已经在问题中添加了json处理程序。编辑代码以便能够读取
后,它将停止识别datetimeobjects@colin_dev256这是因为您的日期处理程序正在引发TypeError!如果类型不是datetime,实际上应该返回对象本身。@gipsy我不确定我是否理解你的意思。我明白错误是怎么回事。当我尝试调试时,python会很好地吐出我的一些日期,直到它用
employees
命中那个对象。