def get_meta_node_class_for_model(model, for_concrete_model=True):
"""
Meta nodes are used to generate a map of the relationships
in the database. There's only a single MetaNode per model.
:param model: Django model class.
:returns: A ``StructuredNode`` class.
"""
if for_concrete_model:
model = model._meta.concrete_model
if model in __meta_cache__:
return __meta_cache__[model]
else:
@six.add_metaclass(MetaNodeMeta)
class MetaNode(MetaNodeMixin, StructuredNode):
__metaclass_model__ = model
class Meta:
model = None # Will pick model from parent class __metaclass_model__ attribute
__meta_cache__[model] = MetaNode
return MetaNode
python类add_metaclass()的实例源码
def get_node_class_for_model(model, for_concrete_model=True):
"""
Model nodes represent a model instance in the database.
:param model: Django model class.
:returns: A ``ModelNode`` class.
"""
if for_concrete_model:
model = model._meta.concrete_model
if model in __node_cache__:
return __node_cache__[model]
else:
@six.add_metaclass(ModelNodeMeta)
class ModelNode(ModelNodeMixin, StructuredNode):
__metaclass_model__ = model
class Meta:
model = None # Will pick model from parent class __metaclass_model__ attribute
__node_cache__[model] = ModelNode
return ModelNode
def test_create_node_class_adds_to_cache(self):
klass1 = get_node_class_for_model(Book)
@six.add_metaclass(ModelNodeMeta)
class ModelNode(ModelNodeMixin, StructuredNode):
class Meta:
model = Book
klass2 = get_node_class_for_model(Book)
self.assertEqual(klass1, klass2)
def test_create_model_node(self):
book = BookFixture(Book).create_one()
@six.add_metaclass(ModelNodeMeta)
class ModelNode(ModelNodeMixin, StructuredNode):
class Meta:
model = Book
self.assertTrue(issubclass(ModelNode, StructuredNode))
self.assertIsInstance(ModelNode(instance=book), StructuredNode)
def test_create_model_with_content_types(self):
permission = Permission.objects.latest('pk')
@six.add_metaclass(ModelNodeMeta)
class ModelNode(ModelNodeMixin, StructuredNode):
class Meta:
model = Permission
self.assertTrue(issubclass(ModelNode, StructuredNode))
self.assertIsInstance(ModelNode(instance=permission), StructuredNode)
def test_create_model_node_declaring_model_in_class(self):
@six.add_metaclass(ModelNodeMeta)
class ModelNode(ModelNodeMixin, StructuredNode):
__metaclass_model__ = Book
class Meta:
model = None
self.assertEqual(ModelNode.Meta.model, Book)
def test_create_model_node_custom_app_label(self):
@six.add_metaclass(ModelNodeMeta)
class ModelNode(ModelNodeMixin, StructuredNode):
class Meta:
model = Book
app_label = 'custom_app_label'
self.assertEqual(ModelNode.Meta.app_label, 'custom_app_label')
def test_create_model_node_fails_without_meta_class(self):
try:
@six.add_metaclass(ModelNodeMeta)
class ModelNode(ModelNodeMixin, StructuredNode):
pass
self.fail('Did not fail when defining a ModelNode without a Meta class.')
except ImproperlyConfigured as e:
self.assertEqual(str(e), '%s must implement a Meta class.' % 'ModelNode')
def test_create_meta_node(self):
@six.add_metaclass(MetaNodeMeta)
class MetaNode(MetaNodeMixin, StructuredNode):
class Meta:
model = Book
self.assertTrue(issubclass(MetaNode, StructuredNode))
self.assertIsInstance(MetaNode(), StructuredNode)
def test_create_meta_node_declaring_model_in_class(self):
@six.add_metaclass(MetaNodeMeta)
class MetaNode(MetaNodeMixin, StructuredNode):
__metaclass_model__ = Book
class Meta:
model = None
self.assertEqual(MetaNode.Meta.model, Book)
def test_create_meta_node_custom_app_label(self):
@six.add_metaclass(MetaNodeMeta)
class MetaNode(MetaNodeMixin, StructuredNode):
class Meta:
model = Book
app_label = 'custom_app_label'
self.assertEqual(MetaNode.Meta.app_label, 'custom_app_label')
def test_create_meta_node_custom_permissions(self):
@six.add_metaclass(MetaNodeMeta)
class MetaNode(MetaNodeMixin, StructuredNode):
class Meta:
model = Publisher
self.assertEqual(MetaNode.Meta.model, Publisher)
def test_create_meta_node_fails_without_meta_class(self):
try:
@six.add_metaclass(MetaNodeMeta)
class MetaNode(MetaNodeMixin, StructuredNode):
pass
self.fail('Did not fail when defining a MetaNode without a Meta class.')
except ImproperlyConfigured as e:
self.assertEqual(str(e), '%s must implement a Meta class.' % 'MetaNode')