在我当前的项目中,我有两个模型,版本和评论。两者之间是一对多的关系;每个Version可以有很多Comment,Comment模型有一个ReferenceProperty来记录它属于哪个Version:
class Comment(db.Model):
version = db.ReferenceProperty(version.Version, collection_name="comments")
问题是 Version 的实例没有像我预期的那样获得comments 属性。 According to the docs ,我应该在每个 Version 上获得一个 automagical 属性,该属性是一个查询,返回所有将其版本设置为相关 Version 实例的 Comment 实例。似乎不适用于我的代码。
我知道 ReferenceProperty 设置正确,因为我可以使用此查询获取评论:
comments = comment.Comment.all().filter('version = ', self).order('-added_on').fetch(500)
但这并不:
comments = self.comments.order('-added_on').fetch(500)
它崩溃了,因为 self 没有属性注释。
下面包含两个模型的完整代码。有谁知道为什么没有为我的 Verson 实例提供反向引用属性?
来自版本.py:
from google.appengine.ext import db
import piece
class Version(db.Model):
parent_piece = db.ReferenceProperty(piece.Piece, collection_name="versions")
note = db.TextProperty()
content = db.TextProperty()
published_on = db.DateProperty(auto_now_add=True)
def add_comment(self, member, content):
import comment
new_comment = None
try:
new_comment = comment.Comment()
new_comment.version = self
new_comment.author = member
new_comment.author_moniker = member.moniker
new_comment.content = content
new_comment.put()
except:
# TODO: handle datastore exceptions here
pass
return new_comment
def get_comments(self):
import comment
comments = None
try:
comments = comment.Comment.all().filter('version = ', self).order('-added_on').fetch(500)
except:
pass
来自comment.py:
import version
import member
from google.appengine.ext import db
class Comment(db.Model):
version = db.ReferenceProperty(version.Version, collection_name="comments")
author = db.ReferenceProperty(member.Member)
author_moniker = db.StringProperty()
author_thumbnail_avatar_url = db.StringProperty()
content = db.TextProperty()
added_on = db.DateProperty(auto_now_add=True)
最佳答案
看起来您正在用自己的属性注释覆盖名为 comments
的自动属性,在这一行中:
comments = self.comments.order('-added_on').fetch(500)
如果将 Comment 模型中的 collection_name 参数更改为“comments_set”,然后将上面的行更改为:
comments = self.comments_set.order('-added_on').fetch(500)
关于python - ReferenceProperty 是否有可能不生成反向引用的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240505/