我的模型中有许多属性,我目前不需要编入索引,但可以想象我可能希望将来在某个未知点编入索引.如果我现在明确设置indexed=False了一个属性但是改变了我的想法,那么Datastore会在那时自动重建整个索引,包括以前写入的数据吗?采取这种方法还有其他影响吗?
我在Google App Engine项目中使用了typeahead.js,并且在使用预取时遇到了问题.
当我使用local时,typeahead工作正常但是如果我将相同的数据集复制到json文件并使用prefetch,则typeahead不起作用,即不显示任何建议.
这是我使用local的代码版本:
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Demo</title>
</head>
<body>
<div><input type="text" name="typeahead-example" placeholder="Type here" class="typeahead-example"></div>
<script src="./js/jquery-1.10.2.js" type="text/javascript"></script>
<script src="./js/hogan.js" type="text/javascript"></script>
<script src="./js/typeahead.min.js" type="text/javascript"></script>
<script>
$(document).ready(function(){
$('input.typeahead-example').typeahead({
name: 'example',
local: [{value: 'Abc Def', tokens: ['Abc', 'Def'], name: 'random1', val2: 'A', val3: 'B'},
{value: 'Def Ghi', tokens: ['Def', 'Ghi'], name: 'random2', val2: 'C', val3: 'D'},
{value: 'Ghi Jkl', tokens: ['Ghi', 'Jkl'], name: 'random3', val2: 'E', val3: 'F'},
{value: 'Jkl Mno', tokens: ['Jkl', 'Mno'], name: 'random4', …Run Code Online (Sandbox Code Playgroud) 作为这篇文章的延续,这是一个顶点式的问题,以巩固我对gae-datastore的理解,并对我的数据建模决策进行一些批评.我将修改由@Jimmy Kane创建的Jukebox示例,以更好地反映我的真实案例.
在原始设置中,
想象一下,每个房间都有一个带有队列的自动点唱机.人们将歌曲排队到每个点唱机的每个队列.
J=Jukebox, Q=queue, S=Song
Jukebox
/ | \
Q1 Q2 Q3
/ | \ | \
S1 S2 S3 S4 S5
Run Code Online (Sandbox Code Playgroud)
首先,填写Song模型:
Song(ndb.Model):
user_key = ndb.KeyProperty()
status = ndb.StringProperty()
datetime_added = ndb.DateTimeProperty()
Run Code Online (Sandbox Code Playgroud)
我的修改是将UserCUD歌曲添加到任何队列中.在前端,用户将访问UI以在每个队列中查看他们的歌曲,并进行更改.在后端,应用程序需要知道每个队列中的哪些歌曲,从每个队列中播放正确的歌曲,并在播放后从队列中删除歌曲.
为了让用户能够在队列中看到它的歌曲我假设每个用户都是一个根实体并且需要存储一个Song键列表
User(ndb.Model):
song_keys = ndb.KeyProperty(kind='Song', repeated=True)
Run Code Online (Sandbox Code Playgroud)
然后,要检索用户的歌曲,应用程序将(假设user_id已知)
user = User.get_by_id(user_id)
songs = ndb.get_multi(user.song_keys)
Run Code Online (Sandbox Code Playgroud)
并且,由于gets非常一致,用户总是会看到非陈旧数据
然后,当队列1完成播放歌曲时,应用程序可以执行以下操作:
current_song.status = "inactive"
current_song.put()
query=Song.query(ancestor=ndb.Key('Jukebox', '1', 'Queue', '1')).filter(Song.status=="active").order(Song.datetime_added)
next_song = query.get()
Run Code Online (Sandbox Code Playgroud)
我是否正确地认为祖先查询确保了当前歌曲的先前停用以及来自用户的任何CUD的一致表示?
最后一步是在事务中更新用户的song_keys列表
user = current_song.user_key.get()
user.song_keys.remove(current_song.key)
user.put()
Run Code Online (Sandbox Code Playgroud)
总结和一些优点/缺点
python google-app-engine entity-framework data-structures google-cloud-datastore