Есть ли причина, по которой ReferenceProperty может не генерировать обратную ссылку?

1

В моем текущем проекте у меня две модели: версия и комментарий. Между ними существует взаимосвязь "один ко многим"; каждая версия может иметь много комментариев, а модель комментариев имеет 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)
Теги:
google-app-engine

1 ответ

3
Лучший ответ

Похоже, вы перезаписываете автоматическое свойство comments со своими собственными комментариями свойств в этой строке:

comments = self.comments.order('-added_on').fetch(500)

Что произойдет, если вы измените аргумент collection_name в вашей модели комментариев как "comments_set", затем измените приведенную выше строку на:

comments = self.comments_set.order('-added_on').fetch(500)
  • 0
    Ну, я буду проклят. Это было глупое название коллекции. Я действительно не думаю, что фундаментальная проблема заключается в том, что я переписывал свойство этим назначением, так как я не присваивал self.comments, только комментарии, но все же смена имени коллекции сделала свое дело. Спасибо, что подтолкнул меня к очевидному ответу, @Peter. Я полностью обмурил себя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню