mirror of
https://github.com/django/django.git
synced 2025-06-04 19:19:13 +00:00
Moved an inner function in db.migrations.state to avoid redefinition.
This commit is contained in:
parent
63f0e2df2a
commit
2ee67f0373
@ -29,18 +29,10 @@ def _get_app_label_and_model_name(model, app_label=''):
|
|||||||
return model._meta.app_label, model._meta.model_name
|
return model._meta.app_label, model._meta.model_name
|
||||||
|
|
||||||
|
|
||||||
def get_related_models_recursive(model):
|
def _get_related_models(m):
|
||||||
"""
|
"""
|
||||||
Returns all models that have a direct or indirect relationship
|
Return all models that have a direct relationship to the given model.
|
||||||
to the given model.
|
|
||||||
|
|
||||||
Relationships are either defined by explicit relational fields, like
|
|
||||||
ForeignKey, ManyToManyField or OneToOneField, or by inheriting from another
|
|
||||||
model (a superclass is related to its subclasses, but not vice versa). Note,
|
|
||||||
however, that a model inheriting from a concrete model is also related to
|
|
||||||
its superclass through the implicit *_ptr OneToOneField on the subclass.
|
|
||||||
"""
|
"""
|
||||||
def _related_models(m):
|
|
||||||
related_models = [
|
related_models = [
|
||||||
subclass for subclass in m.__subclasses__()
|
subclass for subclass in m.__subclasses__()
|
||||||
if issubclass(subclass, models.Model)
|
if issubclass(subclass, models.Model)
|
||||||
@ -50,21 +42,33 @@ def get_related_models_recursive(model):
|
|||||||
if f.is_relation and f.related_model is not None and not isinstance(f.related_model, six.string_types):
|
if f.is_relation and f.related_model is not None and not isinstance(f.related_model, six.string_types):
|
||||||
related_fields_models.add(f.model)
|
related_fields_models.add(f.model)
|
||||||
related_models.append(f.related_model)
|
related_models.append(f.related_model)
|
||||||
# Reverse accessors of foreign keys to proxy models
|
# Reverse accessors of foreign keys to proxy models are attached to their
|
||||||
# are attached to their concrete proxied model.
|
# concrete proxied model.
|
||||||
opts = m._meta
|
opts = m._meta
|
||||||
if opts.proxy and m in related_fields_models:
|
if opts.proxy and m in related_fields_models:
|
||||||
related_models.append(opts.concrete_model)
|
related_models.append(opts.concrete_model)
|
||||||
return related_models
|
return related_models
|
||||||
|
|
||||||
|
|
||||||
|
def get_related_models_recursive(model):
|
||||||
|
"""
|
||||||
|
Return all models that have a direct or indirect relationship
|
||||||
|
to the given model.
|
||||||
|
|
||||||
|
Relationships are either defined by explicit relational fields, like
|
||||||
|
ForeignKey, ManyToManyField or OneToOneField, or by inheriting from another
|
||||||
|
model (a superclass is related to its subclasses, but not vice versa). Note,
|
||||||
|
however, that a model inheriting from a concrete model is also related to
|
||||||
|
its superclass through the implicit *_ptr OneToOneField on the subclass.
|
||||||
|
"""
|
||||||
seen = set()
|
seen = set()
|
||||||
queue = _related_models(model)
|
queue = _get_related_models(model)
|
||||||
for rel_mod in queue:
|
for rel_mod in queue:
|
||||||
rel_app_label, rel_model_name = rel_mod._meta.app_label, rel_mod._meta.model_name
|
rel_app_label, rel_model_name = rel_mod._meta.app_label, rel_mod._meta.model_name
|
||||||
if (rel_app_label, rel_model_name) in seen:
|
if (rel_app_label, rel_model_name) in seen:
|
||||||
continue
|
continue
|
||||||
seen.add((rel_app_label, rel_model_name))
|
seen.add((rel_app_label, rel_model_name))
|
||||||
queue.extend(_related_models(rel_mod))
|
queue.extend(_get_related_models(rel_mod))
|
||||||
return seen - {(model._meta.app_label, model._meta.model_name)}
|
return seen - {(model._meta.app_label, model._meta.model_name)}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user