【问题标题】:GAE - get() entity by property?GAE - 按属性获取()实体?
【发布时间】:2013-04-17 15:59:16
【问题描述】:

如何根据属性的实体获取 Datastore 实体?我是否必须经过多步骤 filter() get() 过程?或者我可以通过 1 件 get() 来完成吗?

例如,假设我有 Datastore 模型 Channel:

class Channel(db.Model):
    name = db.StringProperty(required = True)

现在,如果我想根据频道名称删除频道,我该怎么做:

name = "ch1"
channel = Channel.get("name = " name)
channel.delete()

这个 get 语句不起作用。实现这一目标的实际方法是什么?非常感谢!

【问题讨论】:

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


    【解决方案1】:

    这是根据属性检索实体的方法

    q = db.Query(Channel)
    q.filter("name =", name)
    entities = q.fetch(100) # The number of entities you want to be returned
    if entries:    
        db.delete(entries)
    

    【讨论】:

    • 有道理。但是没有像 get() 这样的返回第一个实体版本吗?即使它只有 1 个实体,您也必须返回一个可迭代对象?
    • 查询,返回一个可迭代的,你必须使用 get_by_id() 或get_by_key_name()。如果您确定每个频道的名称都是唯一的,那么您可以将其指定为实体的 key_name。
    • @golmschenk 是的,你也可以使用 get()。
    【解决方案2】:

    如果你这样做,你最好稍微改变你的设计。如果您按名称获取频道,那么使用频道名称作为键名会更容易(并且更快更便宜)。

    创建实体时只需传递key_name参数(示例借用docs):

    employee = Employee(key_name='asalieri',
                    first_name='Antonio',
                    last_name='Salieri')
    

    然后用

    获取
    k = Key.from_path('Employee', 'asalieri')
    

    获得密钥后,所有其他操作都可以照常进行。

    【讨论】:

      【解决方案3】:

      如果名称字段是唯一标识一个实体,最好将其用作 Sudhir 提到的键。但是,如果有多个实体具有相同的名称,则需要先获取它们

      all = Channel.all(keys_only=True).fetch(1000) # only need key to delete
      db.delete(all)
      

      单行版本

      db.delete(Channel.all(keys_only=True).fetch(1000))
      

      【讨论】:

        猜你喜欢
        • 2016-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2017-04-18
        相关资源
        最近更新 更多