【问题标题】:Datastore One-to-Many Google App Engine数据存储区一对多 Google App Engine
【发布时间】:2016-11-08 11:12:30
【问题描述】:

我很难在模板中显示我的数组项。刚从 GAE 中的实体关系开始,我没有在 SO 上找到合适的解决方案。我必须先在我的处理程序中执行查询吗?如果是这样,我在逻辑上是如何挣扎的。

数据存储Project实体示例展示

数据存储Employees实体示例展示

Project.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()
    isFullDay = ndb.BooleanProperty()
    days = ndb.KeyProperty(kind='CompanyDay', repeated=True)
    employees = ndb.KeyProperty(kind='Employees', repeated=True)
    client = ndb.KeyProperty(kind='Client')

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

模板

data 是通过 Angular 的 http 服务从后端获取的

 <md-content  class="md-padding projects" layout="row" layout-wrap>
        <md-card ng-repeat="data in controller.projects" flex="20" ng-click="editProject(data)">
            <img src="" alt="">
            <md-card-content>
                <div class="project-info">
                    <h2 class="md-title">{{ data.title }}</h2>
                    <p>{{ data.description }}</p>
                    <p>{{ data.employees }}</p>

                </div>
            </md-card-content>
        </md-card>
    </md-content>

响应 /cmets 的 Python 代码

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

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

    def date_handler(obj):
        print obj
        if isinstance(obj, datetime):
            return obj.isoformat()
        else:
            return str(obj)

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

来自 Angular - 从服务器请求的代码

    var vm = this;
    vm.projects = [];
    $http.get('/comments')
        .then(function(result) {
            console.log(result);
            vm.projects = result.data;
         });

将员工显示为来自数据存储区。

【问题讨论】:

  • 请勿贴代码图片。
  • 另外,您需要实际发布检索数据的代码。
  • 编辑帖子以在 Angular 中包含服务器获取代码。
  • 响应 /cmets 的 Python 代码是什么?
  • 现在包含在编辑中

标签: python angularjs google-app-engine google-cloud-datastore


【解决方案1】:

您可以更改 date_handler 以处理 ndb.Key 以在返回的 json 中正确呈现您的 Employee 集合

def date_handler(obj):
    print obj
    if isinstance(obj, datetime):
        return obj.isoformat()
    elif isinstance(obj, ndb.Key):
      return obj.get().to_dict()
    else:
        return str(obj)

您可能想要更改此方法的名称,因为它不再只是进行 date_handling 了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多