如何获取数据存储区中没有特定属性的实体

时间:2011-08-22 10:48:48

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

我正在努力建立一个评估系统 这是我的班级

class Goal(db.Expando):
  GID = db.IntegerProperty(required=True)
  description = db.TextProperty(required=True)
  time = db.FloatProperty(required=True)
  weight = db.IntegerProperty(required=True)
  Emp = db.UserProperty(auto_current_user=True)
  Status = db.BooleanProperty(default=False)

以下事项由员工提供,

class SubmitGoal(webapp.RequestHandler):
    def post(self):
      dtw = simplejson.loads(self.request.body)
      try:
        maxid = Goal.all().order("-GID").get().GID + 1
      except:
        maxid = 1
      try:
        g = Goal(GID=maxid, description=dtw[0], time=float(dtw[1]), weight=int(dtw[2]))
        g.put()
        self.response.out.write(simplejson.dumps("Submitted"))
      except:
        self.response.out.write(simplejson.dumps("Error"))

现在,此处管理员检查目标并批准或不批准...如果已批准,则状态将在数据存储中存储为true,否则为false

idsta = simplejson.loads(self.request.body)
    try:
        g = db.Query(Goal).filter("GID =", int(idsta[0])).get()
        if g:
            if idsta[1]:
                g.Status=True
                try:
                    del g.Comments
                except:
                    None
            else:
                g.Status=False
                g.Comments=idsta[2]
            db.put(g)
            self.response.out.write(simplejson.dumps("Submitted"))
    except:
        self.response.out.write(simplejson.dumps("Error"))

现在,这就是我卡住的地方......“filter('status =',True)”..这将返回所有状态为真的实体..意味着哪些被批准..我想要那些实体已批准的AND尚未经过员工评估..

def get(self):
    t = []
    for g in Goal.all().filter("Status = ",True):
        t.append([g.GID, g.description, g.time, g.weight, g.Emp])
    self.response.out.write(simplejson.dumps(t))
def post(self):
    idasm = simplejson.loads(self.request.body)
    try:
        g = db.Query(Goal).filter("GID =", int(idasm[0])).get()
        if g:
            g.AsmEmp=idasm[1]
            db.put(g)
            self.response.out.write(simplejson.dumps("Submitted"))
    except:
        self.response.out.write(simplejson.dumps("Error"))

我该怎么做?据我所知,如果我添加另一个过滤器,如“filter('AsmEmp =',而不是None)”,这只会返回那些具有AsmEmp属性的实体,反之亦然。

3 个答案:

答案 0 :(得分:4)

你明确不能这样做。正如documentation所述:

  

无法查询缺少给定属性的实体。

相反,为is_assessed创建一个默认为False的属性,并对其进行查询。

答案 1 :(得分:0)

你不能简单地为employee_assessed = db.user添加另一个字段吗? 并且在评估时只填充它?

答案 2 :(得分:0)

记录不缺少数据存储区中的属性,它只是设置为None。您可以使用Goal.all().filter('status =', True).filter('AsmEmp =', None)查询这些记录。

关于您的代码的一些附带建议:

  1. '状态'是布尔值的一个相当不直观的名称。
  2. 使用小写字母开始属性和属性通常是很好的Python样式。
  3. 您不应直接迭代查询。这会以批量方式获取结果,并且比执行显式提取效率低得多。而是使用.fetch(n)获取所需的结果数。
  4. 没有指定异常类的try / except并且在发生异常时不采取任何操作是一个非常糟糕的主意,并且可以掩盖各种各样的问题。
  5. 编辑:我没注意到你使用的是Expando - 在这种情况下@ Daniel的回答是正确的。但是,似乎没有任何理由在这里使用Expando。将属性添加到模型(以及更新现有实体)将是最简单的解决方案。