【问题标题】:GAE posting an array to the datastore with Python (One to Many)GAE 使用 Python 将数组发布到数据存储区(一对多)
【发布时间】:2017-03-14 20:48:10
【问题描述】:

已经与 GAE 合作了几个月。这是我第一次在这里处理一对多关系。在我开始处理关系之前,一切都很好地发布到了数据存储中。这是第一个。有人可以帮我把这个“帖子”发到数据存储区吗?文档和其他示例现在非常混乱。我知道我做错了employees=r['Employees'], 我只想先发一个简单的帖子。如果你能把它弄得更好!如图所示,我在发布时收到 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()

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))

【问题讨论】:

    标签: python angularjs google-app-engine webapp2


    【解决方案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
    

    【讨论】:

    • 肯定想在列表中累积新员工实体,然后在循环后执行 ndb.put_multi() 。如果您想要快速响应时间,千万不要**在循环中执行单个 put()。 (** 永远不要说永远)
    • @stevep 感谢您提供额外的见解。很好解决了@gipsy。所以现在我的 json 处理程序在我 self.response.out.write(json.dumps([rec.to_dict() for rec in recommendations], default=date_handler)) 时使用 json.dumps() 转储密钥时遇到问题。来自Project.query() 的地方是recommendations。引发了 TypeError
    • 我已将 json 处理程序添加到问题中。编辑代码以能够读取key 后,它会停止识别日期时间对象
    • @colin_dev256 那是因为你的 date_handler 引发了 TypeError!如果类型不是日期时间,您实际上应该返回对象本身。
    • @gipsy 我不确定我理解你的意思。我明白错误是关于什么的。当我尝试调试时,python 会很好地吐出我的一些日期,直到它使用 employees 命中该对象。
    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多