<p>如果不需要查询数据中的属性,可以使用@voscausa所提到的属性之一:</p>
<p>JsonProperty公司</p>
<pre><code>class MyModel(ndb.Model):
city = ndb.StringProperty()
date = ndb.DateProperty()
data = ndb.JsonProperty()
my_model = MyModel(city="somewhere",
date=datetime.date.today(),
data={'keyword1': 3,
'keyword2': 5,
'keyword3': 1,})
</code></pre>
<p>结构属性:</p>
<pre><code>class Data(ndb.Model):
keyword = ndb.StringProperty()
count = ndb.IntegerProperty()
class MyModel(ndb.Model):
city = ndb.StringProperty()
date = ndb.DateProperty()
data = ndb.StructuredProperty(Data, repeated=True)
my_model = MyModel(city="somewhere",
date=datetime.date.today(),
data=[Data(keyword="keyword1", count=3),
Data(keyword="keyword2", count=5),
Data(keyword="keyword3", count=1)])
my_model.put()
</code></pre>
<p>这里的问题是过滤结构化属性。关键字的属性被视为并行数组。执行查询,例如:</p>
<pre><code>q = MyModel.query(MyModel.data.keyword=='keyword1',
MyModel.data.count > 4)
</code></pre>
<p>将不正确地包含<code>my_model</code>。</p>
<p><a href="https://developers.google.com/appengine/docs/python/ndb/queries#filtering_structured_properties" rel="noreferrer">https://developers.google.com/appengine/docs/python/ndb/queries#filtering_structured_properties</a></p>
<p>使用expando模型可以工作并允许您查询关键字:</p>
<pre><code>class MyModel(ndb.Expando):
city = ndb.StringProperty()
date = ndb.DateProperty()
m = MyModel(city="Somewhere", date=datetime.date.today())
m.keyword1 = 3
m.keyword2 = 5
m.keyword3 = 1
m.put()
q = MyModel.query(ndb.GenericProperty('keyword1') > 2)
</code></pre>
<p><a href="https://developers.google.com/appengine/docs/python/ndb/entities#expando" rel="noreferrer">https://developers.google.com/appengine/docs/python/ndb/entities#expando</a></p>