Merge "Add hierarchical dependency to current model"
This commit is contained in:
commit
5135dc38ca
|
@ -194,7 +194,7 @@ class _CommonBase(models.Base):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def dependencies(cls):
|
def dependencies(cls):
|
||||||
deps = []
|
deps = set()
|
||||||
for key, field in cls.iterate_over_fields():
|
for key, field in cls.iterate_over_fields():
|
||||||
if isinstance(field, fields.ListField):
|
if isinstance(field, fields.ListField):
|
||||||
types = field.items_types
|
types = field.items_types
|
||||||
|
@ -203,11 +203,16 @@ class _CommonBase(models.Base):
|
||||||
|
|
||||||
for field_type in types:
|
for field_type in types:
|
||||||
try:
|
try:
|
||||||
deps.append(field_type.get_proxied_model())
|
deps.add(field_type.get_proxied_model())
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
if issubclass(field_type, ModelBase):
|
||||||
|
# If the field is not a reference, and it is a df
|
||||||
|
# model(derived from ModelBase), it is considered as
|
||||||
|
# non-first class model. And its dependency
|
||||||
|
# will be treated as current model's dependency.
|
||||||
|
deps |= field_type.dependencies()
|
||||||
|
|
||||||
return set(deps)
|
return deps
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_first_class(cls):
|
def is_first_class(cls):
|
||||||
|
|
|
@ -135,6 +135,18 @@ class EmbeddingModel2(mf.ModelBase):
|
||||||
emb_required = fields.EmbeddedField(EmbeddedModel, required=True)
|
emb_required = fields.EmbeddedField(EmbeddedModel, required=True)
|
||||||
|
|
||||||
|
|
||||||
|
@mf.construct_nb_db_model
|
||||||
|
class ReffingNonFirstClassModel(mf.ModelBase):
|
||||||
|
ref1 = df_fields.ReferenceField(ReffedModel)
|
||||||
|
|
||||||
|
|
||||||
|
@mf.register_model
|
||||||
|
@mf.construct_nb_db_model
|
||||||
|
class ReffingModel3(mf.ModelBase):
|
||||||
|
table_name = 'ReffingModel3'
|
||||||
|
ref = fields.ListField(ReffingNonFirstClassModel)
|
||||||
|
|
||||||
|
|
||||||
class TestModelFramework(tests_base.BaseTestCase):
|
class TestModelFramework(tests_base.BaseTestCase):
|
||||||
def test_lookup(self):
|
def test_lookup(self):
|
||||||
self.assertEqual(ModelTest, mf.get_model('ModelTest'))
|
self.assertEqual(ModelTest, mf.get_model('ModelTest'))
|
||||||
|
@ -418,3 +430,11 @@ class TestModelFramework(tests_base.BaseTestCase):
|
||||||
(emb1, emb2, emb3),
|
(emb1, emb2, emb3),
|
||||||
embedding1.iterate_embedded_model_instances(),
|
embedding1.iterate_embedded_model_instances(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_hierarchical_dependency(self):
|
||||||
|
sorted_models = mf.iter_models_by_dependency_order()
|
||||||
|
self.assertLess(
|
||||||
|
sorted_models.index(ReffedModel),
|
||||||
|
sorted_models.index(ReffingModel3)
|
||||||
|
)
|
||||||
|
self.assertIn(ReffedModel, ReffingModel3.dependencies())
|
||||||
|
|
Loading…
Reference in New Issue