1

我正在使用Google Appengine和Python製作Udacity的網絡開發課程。在創作過程中爲作者分配作者

我想知道如何分配給創建實體,它自己的作者

例如,我有兩個ndb.Models種:

class User(ndb.Model): 
    username = ndb.StringProperty(required = True) 
    bio = ndb.TextProperty(required = True) 
    password = ndb.StringProperty(required = True) 
    email = ndb.StringProperty() 
    created = ndb.DateTimeProperty(auto_now_add = True) 

class Blog(ndb.Model): 
    title = ndb.StringProperty(required = True) 
    body = ndb.TextProperty(required = True) 
    created = ndb.DateTimeProperty(auto_now_add = True) 

當通過登錄的用戶,其自身的作者(用戶實體)也應確定創建博客實體用它。

最後,我想顯示一個博客的帖子及其作者的信息(例如,作者的生物

如何才能實現這一目標?

回答

2

Blog類應該包括一個屬性來存儲它是誰寫的用戶的關鍵:

author = ndb.KeyProperty(required = True) 

然後,您可以在創建博客實例設置該屬性:

blog = Blog(title="title", body="body", author=user.key) 

對於優化,如果您知道登錄用戶的ndb.Key,並且您不需要用戶實體本身,則可以直接傳遞該用戶實例,而不需要先獲取用戶。

assert isinstance(user_key, ndb.Key) 
blog = Blog(title="title", body="body", author=user_key) 

在全:

class User(ndb.Model): 
    username = ndb.StringProperty(required = True) 
    password = ndb.StringProperty(required = True) 
    email = ndb.StringProperty() 
    created = ndb.DateTimeProperty(auto_now_add = True) 

class Blog(ndb.Model): 
    title = ndb.StringProperty(required = True) 
    body = ndb.TextProperty(required = True) 
    created = ndb.DateTimeProperty(auto_now_add = True) 
    author = ndb.KeyProperty(required = True) 

def new_blog(author): 
    """Creates a new blog post for the given author, which may be a ndb.Key or User instance""" 
    if isinstance(author, User): 
     author_key = author.key 
    elif isinstance(author, ndb.Key): 
     assert author.kind() == User._get_kind() # verifies the provided ndb.Key is the correct kind. 
     author_key = author 

    blog = Blog(title="title", body="body", author=author_key) 
    return blog 

可能會因規範new_blog年初的效用函數得到積分

+0

謝謝@Josh。我想我已經明白了!後續問題:是否將作者存儲爲_KeyProperty_的最佳方式?在這種情況下,通過_StringProperty_使用_KeyProperty_的優點是什麼? – puoyaahhh

+1

如果您希望作者的名稱能夠更改,您將需要使用「KeyProperty」。你可以用'author = blog.author.get()'獲取作者,然後用'author.username'獲取用戶名 - 如果你想壓縮到一行,你有'blog.author.get().user'' ,但你最好想保留作者參考。 – Josh

+0

我剛剛遇到'ReferenceProperty'屬性,它看起來與此處所述的解決方案非常相似。在這種情況下,是否有任何理由在ReferenceProperty上使用KeyProperty? – puoyaahhh