如何构建电影数据库和用户选择?

LA_*_*LA_ 3 google-app-engine app-engine-ndb google-cloud-datastore

我想创建电影数据库,用户可以在其中标记他/她观看和喜欢的电影:

class Movies(ndb.Model):
    watched = ndb.UserProperty()
    liked = ndb.UserProperty()
Run Code Online (Sandbox Code Playgroud)

那会有用吗?我使用Google帐户.我应该如何选择用户喜欢的所有电影?


更新.我遵循了systempuntoout方法并使用以下代码来保存用户选择:

user = users.get_current_user()
if user:
    userschoices = models.UsersChoices(
        movie=ndb.Key(models.Movies, movie_id), # TODO: what if movie_id is wrong?
        watched=True,
        user_id=user.user_id()
        )
    try:
        userschoices.put()
        self.response.out.write('1')
    except:
        self.response.out.write('0')
Run Code Online (Sandbox Code Playgroud)

但是如果用户多次做出选择,那么会在数据存储区中添加几条记录...将用户ID和电影ID保存为键名不是更好吗?

userschoices = models.UsersChoices.get_by_id(user.user_id() + '-' + movie_id)
if userschoices is None:
    userschoices = models.UsersChoices(id=user.user_id() + '-' + movie_id)
userschoices.movie = ndb.Key(models.Movies, movie_id) # TODO: what if movie_id is wrong?
userschoices.user_id = user.user_id()
if option == 'liked':
    userschoices.liked = True
elif option == 'watched':
    userschoices.watched = True
Run Code Online (Sandbox Code Playgroud)

但是,如果我没有通过这种方法liked,那么它会覆盖它的值None(watched如果没有通过None则使用相同的).

sys*_*out 8

我会选择两个不同的模型,一个存储所有Movies细节,一个存储UserChoices:

class Movies(ndb.Model):
    title = ndb.StringProperty(required=True)
    director = ndb.StringProperty()
    whatever = ndb.StringProperty()

class UsersChoices(ndb.Model):
    movie = ndb.KeyProperty(kind=Movies, required=True)
    watched = ndb.BooleanProperty(required=True)
    liked = ndb.BooleanProperty(required=True)
    user_id = ndb.StringProperty(required=True)

    @classmethod
    def get_liked_movies(cls, user_id):
        return cls.query(cls.user_id == user_id, cls.liked == true).fetch(10)

    @classmethod
    def get_watched_movies(cls, user_id):
        return cls.query(cls.user_id == user_id, cls.watched == true).fetch(10)

    @classmethod
    def get_by(cls, user_id, movie_key):
        return cls.query(cls.user_id == user_id, cls.movie == movie_key).get()
Run Code Online (Sandbox Code Playgroud)

如果您需要存储有关用户的信息,您应该创建UserInfo模型,user_id使用用户API键入,以及应用程序所需的所有详细信息.

class UserInfo(ndb.Model):
        #Keyed by user_id 
        nickname = ndb.StringProperty()
        email = ndb.StringProperty()
Run Code Online (Sandbox Code Playgroud)

要创建新的UserInfo,您可以:

from google.appengine.api import users

user = users.get_current_user()
userinfo = UserInfo(
        id = user.user_id(),
        nickname = user.keyname(),
        email = user.email()
      )
userinfo.put()
Run Code Online (Sandbox Code Playgroud)

然后,当用户登录时,使用他/她user_id来检索观看/喜欢的电影.

from google.appengine.api import users

user = users.get_current_user()
userinfo = ndb.Key(UserInfo, user.user_id()).get()
watched_movies = UsersChoices.get_watched_movies(userinfo.key.id())
liked_movies = UsersChoices.get_liked_movies(userinfo.key.id())
Run Code Online (Sandbox Code Playgroud)