Google NDB - обязательное свойство в структуре StructuredProperty не работает должным образом - PullRequest
0 голосов
/ 08 октября 2018

Я столкнулся с проблемой с обязательным параметром 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, это будетеще более точный вопрос ...

1 Ответ

0 голосов
/ 09 октября 2018

У вас есть required = True для 'model_id'.Вы пытаетесь put() сущность, не определяя ее (null не считается).

Ваши put() s включены MyModel.Не уверен, почему требование submodel_id в SubModel не проверяется при putting на родительской модели.Кажется, это следует проверить.Можете ли вы проверить хранилище данных и посмотреть, что на самом деле было put()?Когда вы читаете эту сущность, что вы получаете?

...