谷歌应用引擎中的多对多关系建模

时间:2010-12-03 16:33:05

标签: google-app-engine modeling

我遵循了概述here的内容。这是我的代码:

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:'Book'对象没有属性'authors'

1 个答案:

答案 0 :(得分:2)

ReferencePropertiesquery-objects添加为引用类的属性。所以仔细看看你的映射:

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属性,而不是authors。而且,a将具有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没有其他属性,请务必查看您引用的文章中列出的list-of-keys方法。