В моем текущем проекте у меня две модели: версия и комментарий. Между ними существует взаимосвязь "один ко многим"; каждая версия может иметь много комментариев, а модель комментариев имеет ReferenceProperty для записи той версии, которой она принадлежит:
class Comment(db.Model):
version = db.ReferenceProperty(version.Version, collection_name="comments")
Проблема в том, что экземпляры версии не получают свойство комментариев, как я ожидал. В соответствии с документами, я должен получить автоматическое свойство для каждой версии, которое является запросом, который возвращает все экземпляры комментариев, для которых их версия установлена на Образец версии. Кажется, не работает для моего кода.
Я знаю, что ReferenceProperty установлен правильно, потому что я могу получить Комментарии с этим запросом:
comments = comment.Comment.all().filter('version = ', self).order('-added_on').fetch(500)
но это не так:
comments = self.comments.order('-added_on').fetch(500)
он выходит из строя, потому что у пользователя нет комментариев о свойствах.
Полный код для двух моделей приведен ниже. Кто-нибудь знает, почему свойство back-reference не предоставляется моему экземпляру 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
from 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)
Что произойдет, если вы измените аргумент collection_name в вашей модели комментариев как "comments_set", затем измените приведенную выше строку на:
comments = self.comments_set.order('-added_on').fetch(500)