防止ndb数据存储区中的重复属性

时间:2017-01-25 21:09:25

标签: python google-app-engine datastore

我正在构建一个收集电子邮件地址的简单时事通讯应用程序。我有一个表单,通过ajax将电子邮件值发送到我的python应用程序,但我不能,在我的生活中,弄清楚如何查看电子邮件是否已存在。以下代码目前正在运行,我只是不知道在哪里/如何添加"检查预先存在的实体"东西。

import webapp2
import json

from google.appengine.ext import ndb

class Email(ndb.Model):
    email = ndb.StringProperty()
    subscribed = ndb.BooleanProperty()

    @staticmethod
    def create(email):
        ekey = ndb.Key("Email", email)
        entity = Email.get_or_insert(ekey)
        if entity.email:  ###
            # This email already exists
            return None
        entity.email = email
        entity.subscribed = True
        entity.put()
        return entity

class Subscribe(webapp2.RequestHandler):
    def post(self):
        add = Email.create(self.request.get('email'))
        success = add is not None 
        self.response.headers['Content-Type'] = 'application/json'   
        obj = {
            'success': success
        } 
        self.response.out.write(json.dumps(obj))


app = webapp2.WSGIApplication([
    webapp2.Route(r'/newsletter/new', Subscribe),
], debug=True)

2 个答案:

答案 0 :(得分:1)

根据Dan的评论更新了答案。丹,谢谢你纠正我。进一步更新,以回应更新的问题。

您可以将电子邮件地址设置为电子邮件实体的ID,然后使用get_or_insert。这里的电子邮件存储是多余的,因为它是id和属性。你可以通过检查下面###的另一个属性来摆脱这种冗余。

class Email(ndb.Model):
    email = ndb.StringProperty()
    subscribed = ndb.BooleanProperty()

    @staticmethod
    def create(email):
        ekey = ndb.Key("Email", email)
        entity = Email.get_or_insert(ekey)
        if entity.email:  ###
            # This email already exists
            return None
        entity.email = email
        entity.subscribed = True
        entity.put()
        return entity

class Subscribe(webapp2.RequestHandler):
    def post(self):
        add = Email.create(self.request.get('email'))
        success = add is not None 
        self.response.headers['Content-Type'] = 'application/json'   
        obj = {
            'success': success
        } 
        self.response.out.write(json.dumps(obj))

我还没有对上面的代码进行测试,因此可能会出现错误,但它应该引导您走上正确的道路。

答案 1 :(得分:1)

这是一种始终创建单独模型类的好方法。我创建了单独的模型类并更新了您的Subscribers类post方法,如果电子邮件存在,它将返回false,否则它将返回true。我希望它能解决你的问题。

class EmailModel(ndb.Model):
       email = ndb.StringProperty()
       subscribed = ndb.BooleanProperty()

class Subscribe(webapp2.RequestHandler):
      def post(self):
         email = self.request.get('email')
         entity = EmailModel.query(EmailModel.email == email).get()
         if entity:
             # Duplicate
             check = False
         else:
             add = Email()
             add.email = self.request.get('email')
             add.subscribed = True
             add.put()
             check = True
         if check:
              self.response.headers['Content-Type'] = 'application/json'   
              obj = {
                'success': True
              } 
              self.response.out.write(json.dumps(obj))
         else:
              self.response.headers['Content-Type'] = 'application/json'   
              obj = {
                'success': False
              } 
              self.response.out.write(json.dumps(obj))