代码之家  ›  专栏  ›  技术社区  ›  Adam Crossland

get \u by \u id()不会返回模型实例

  •  3
  • Adam Crossland  · 技术社区  · 14 年前

    我有一个叫做Version的模型,看起来像这样:

    from google.appengine.ext import db
    import piece
    
    class Version(db.Model):
        "A particular version of a piece of writing."
    
        parent_piece = db.ReferenceProperty(piece.Piece, collection_name='versions')
        "The Piece to which this version belongs."
    
        note = db.TextProperty()
        "A note from the Author about this version."
    
        content = db.TextProperty()
        "The actual content of this version of the Piece."
    
        published_on = db.DateProperty(auto_now_add=True)
        "The date on which the version was published."
    

    我想使用Version.get\u by\u id()通过其id访问Version的实例,但此调用始终返回 . 我可以在数据存储查看器中看到它们具有ID值,在调试器中,我可以查询它们,但不能使用它们:

    >>> for each_ver in version.Version.all():
    ...  print each_ver.key().id()
    ... 
    34
    35
    36
    31
    32
    >>> a = version.Version.get_by_id(34)
    >>> type(a)
    <type 'NoneType'>
    

    我看到这里有很多问题,人们可以像我所希望的那样有效地使用get\u by\u id(),但他们没有看到我看到的结果。

    问题是每个人 版本 实例是实体组中的子级,而不是实体组的根?每个 版本 生活在看起来像成员的实体组中->件->版本。如果这就是问题所在,有没有一种方法可以引用Version实体而不使用其整个键?如果这不是问题,有人能告诉我我能做些什么吗 按预期工作?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Nick Johnson    14 年前

    问题是每个版本 实例是实体组中的子级 而不是实体组的根?

    对。实体的键包括任何父实体的键。

    我可以引用版本实体的方式 不使用整个钥匙?

    不可以。一个实体只由它的整个密钥唯一标识,其中包括所有父实体的密钥。但是,如果您知道其父实体的种类,则可以使用db.Key.from\ u path从ID或密钥名称链构造密钥。

        2
  •  0
  •   Henrique Limas    9 年前

    我也有同样的问题,但是在ndb.Model中,我发现我需要将ID转换成int version.Version.get_by_id(int(34)) 可以解决你的问题。