Google app engine AppEngine模型/处理程序问题

Google app engine AppEngine模型/处理程序问题,google-app-engine,Google App Engine,我们的团队对AppEngine来说相对较新,我们仍在学习诀窍。我们使用的是普通的ndb.Model模型(也就是说,没有什么特别的)和webapp2处理程序。该应用程序没有UI,因为它只是一个restful API 因此,我们有一个这样定义的模型: from google.appengine.ext import ndb class Pasta(ndb.Model): type = ndb.StringProperty(indexed=True) name = ndb.StringProper

我们的团队对AppEngine来说相对较新,我们仍在学习诀窍。我们使用的是普通的ndb.Model模型(也就是说,没有什么特别的)和webapp2处理程序。该应用程序没有UI,因为它只是一个restful API

因此,我们有一个这样定义的模型:

from google.appengine.ext import ndb
class Pasta(ndb.Model):
 type = ndb.StringProperty(indexed=True)
 name = ndb.StringProperty()
 contents = ndb.JsonProperty()
 modified_date = ndb.DateTimeProperty(auto_now=True)
 added_date = ndb.DateTimeProperty(auto_now_add=True)
用例是,如果一条记录不存在,我们希望添加一条记录,如果它确实存在,则返回它。我们可以在处理程序中查询它,甚至在那里创建一个,然后使用
意大利面.put()
实例方法创建一个新的。但是,我们认为数据绑定代码属于模型,而不是处理程序,但是,如果我们没有弄错的话,在模型上下文中,我们需要使用
get\u或\u insert()
,这要求我们显式声明一个键,对吗


有没有关于如何在模型中处理这种逻辑的建议?TIA.

我不知道您为什么认为代码是否进入模型或处理程序的决定决定了您执行查询的方法。您可以在任意位置使用
get\u或\u insert
,但这确实意味着您需要知道所需实体的密钥。而且,您可以在任何地方进行查询

如果您确实希望将所有数据交互保持在模型中,一种可能的模式是在模型上定义一个classmethod来执行查询并返回现有实例或新实例。比如:

class Pasta(ndb.Model): 
    ...
    @classmethod
    def get_or_create(cls, type=None, name=None):
        query = cls.query(cls.type=type, cls.name=name)
        existing = query.get()
        if existing:
            return existing
        else:
            new_item = cls(type=type, name=name)
            new_item.put()
            return new_item

(注意,我实际上没有使用ndb,但这或多或少是正确的。)您需要确保在事务中调用此方法。

我不知道为什么您认为关于代码是否进入模型或处理程序的决定决定决定了您用于执行查询的方法。您可以在任意位置使用
get\u或\u insert
,但这确实意味着您需要知道所需实体的密钥。而且,您可以在任何地方进行查询

如果您确实希望将所有数据交互保持在模型中,一种可能的模式是在模型上定义一个classmethod来执行查询并返回现有实例或新实例。比如:

class Pasta(ndb.Model): 
    ...
    @classmethod
    def get_or_create(cls, type=None, name=None):
        query = cls.query(cls.type=type, cls.name=name)
        existing = query.get()
        if existing:
            return existing
        else:
            new_item = cls(type=type, name=name)
            new_item.put()
            return new_item

(注意,我实际上没有使用ndb,但这或多或少是正确的。)您需要确保在事务中调用此方法。

对于创建实例(或记录)属于模型的原因,您有一个非常奇怪的参数

是的,模型表示数据,但处理程序负责创建模型实例。你没有提供足够的信息来说明你的处理程序是做什么的

首先,您需要确定要将什么用作密钥。如果您只是使用ndb随机创建的键,我不知道如何确定记录是否存在。我假设您希望使用意大利面食.type或意大利面食.name作为键

在这种情况下,“type”或“name”可能会作为参数提供给处理程序,并且处理程序会在根据其参数构造密钥后调用get_或_insert


我还可以打断你的问题,说你只想要给定面食型号的一张唱片。这将是相当非典型的数据存储用法,但在这种情况下,在模型中使用方法检查单个实例是否存在可能是有意义的。在这种情况下,您可以硬编码密钥。

对于创建实例(或记录)属于模型的原因,您有一个非常奇怪的参数

是的,模型表示数据,但处理程序负责创建模型实例。你没有提供足够的信息来说明你的处理程序是做什么的

首先,您需要确定要将什么用作密钥。如果您只是使用ndb随机创建的键,我不知道如何确定记录是否存在。我假设您希望使用意大利面食.type或意大利面食.name作为键

在这种情况下,“type”或“name”可能会作为参数提供给处理程序,并且处理程序会在根据其参数构造密钥后调用get_或_insert


我还可以打断你的问题,说你只想要给定面食型号的一张唱片。这将是相当非典型的数据存储用法,但在这种情况下,在模型中使用方法检查单个实例是否存在可能是有意义的。在这种情况下,您可以硬编码密钥。

密钥访问比查询更快、成本更低。在实现查询之前,最好始终确定不能使用ID。另外,请记住,所有模型属性的默认索引状态均为True,因此,无论何时设置模型,最好始终将状态index=True/False。在许多情况下,人们忘记了默认值是真的,然后想知道为什么他们的索引存储在只查询少量属性时变得非常大。您是否希望在其他模型属性上建立索引???

密钥访问比查询更快、成本更低。在实现查询之前,最好始终确定不能使用ID。另外,请记住,所有模型属性的默认索引状态均为True,因此,无论何时设置模型,最好始终将状态index=True/False。在许多情况下,人们忘记了默认值是真的,然后想知道为什么他们的索引存储在只查询少量属性时变得非常大。您想要其他模型属性的索引吗???

谢谢。这为我们提供了一个起点。您不能在事务中使用非祖先查询。谢谢。这为我们提供了一个起点。您不能在事务中使用非祖先查询。