Я столкнулся с проблемой с обязательным параметром ndb.Model, когда он помещается в модель, указанную в качестве структуры из StructuredProperty.
Вот определение модели:
class SubModel(ndb.Model):
submodel_id = ndb.StringProperty(required=True)
class MyModel(ndb.Model):
model_id = ndb.StringProperty(required = True)
submodels = ndb.StructuredProperty(SubModel, repeated=True)
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
if 'submodels' in kwargs.keys():
_submodels = []
for kwarg in kwargs['submodels']:
if isinstance(kwarg, SubModel):
_submodels.append(kwarg)
else:
t = SubModel(**kwarg)
_submodels.append(t)
self.submodels = _submodels
То, что я хочу сделать, это либо создать модель без подмоделей, либо создать модель, в которой каждая подмодель имеет требуемый идентификатор, в противном случае возникает ошибка.
Поэтому, когда я тестирую эту модель, я получаю следующие результаты:
args1 = {"model_id":"some_id","submodels":[{"submodel_id":null}]}
model1 = MyModel(**args1)
model1.put()
print model1.key.id()
# Everything works while submodel_id hasn't been set and it returns the key id from Google Datastore
args2 = {"model_id":null,"submodels":[{"submodel_id":"some_id"}]}
model2 = MyModel(**args2)
model2.put()
print model2.key.id()
# Google Datastore raises an error : Entity has uninitialized properties: model_id
Является ли это поведение стандартным поведением из ndb.StructuredProperty (что означает, что никакие опции свойств не рассматриваются из указанной структуры) илия должен реализовать то, что я хочу сделать по-другому?
То, что я также хочу сделать, это заставить Submodel наследовать от ndb.Expando вместо ndb.Model, но так как ndb.Expando наследует от ndb.Model, это будетеще более точный вопрос ...