Моделирование отношений «многие ко многим» в Google App Engine - PullRequest
1 голос
/ 03 декабря 2010

Я следовал тому, что намечено здесь . Вот мой код:

from google.appengine.api import users
from google.appengine.ext import db


class Book(db.Model):
    title = db.StringProperty()

class Author(db.Model):
    name = db.StringProperty()

class BookAuthor(db.Model):
    book = db.ReferenceProperty(Book, required=True, collection_name='books')
    author = db.ReferenceProperty(Author, required=True, collection_name='authors')

b = Book(title="My Book")
a = Author(name="Author of My Book")

db.put([b, a])

ba = BookAuthor(book=b, author=a)
ba.put()

b.authors
a.books

и я получаю AttributeError: объект «Книга» не имеет атрибута «авторы»

1 Ответ

2 голосов
/ 03 декабря 2010

ReferenceProperties добавить объекты запроса в качестве атрибутов к указанному классу.Так что внимательно посмотрите на ваши отображения:

class BookAuthor(db.Model):
    # This adds a query-object as an attribute named 'books' to Book entities.
    book = db.ReferenceProperty(Book, required=True, collection_name='books')
    # This adds a query-object as an attribute named 'authors' to Author entities.
    author = db.ReferenceProperty(Author, required=True, collection_name='authors')

В вашем коде:

b = Book(title="My Book")
a = Author(name="Author of My Book")

Итак, b будет иметь атрибут books, а не authorsa будет иметь атрибут authors, а не books.

Если вы измените имена коллекций, ваш код должен запуститься.

class BookAuthor(db.Model):
    # This adds a query-object as an attribute named 'authors' to Book entities.
    book = db.ReferenceProperty(Book, required=True, collection_name='authors')
    # This adds a query-object as an attribute named 'books' to Author entities.
    author = db.ReferenceProperty(Author, required=True, collection_name='books')

Кроме того, если BookAuthor не имеет дополнительных свойств, обязательно посмотрите список ключей.метод, описанный в статье, на которую вы ссылались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...