1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- from django.apps import apps
- from django.core.management.base import BaseCommand
- from django.db.models.fields.related import ForeignKey, ManyToManyField, OneToOneField
- class Command(BaseCommand):
- help = 'Lists relations between models'
- def handle(self, *args, **options):
- relation_fields = (ForeignKey, OneToOneField, ManyToManyField)
- field_pattern = "%s=%s(%s, on_delete=%s)\n"
- for app in apps.get_app_configs():
- app_header_printed = False
- if app.name.startswith('misago.') and app.models_module:
- for model in app.get_models():
- # Search model for relations
- model_relations = []
- for field in model._meta.fields:
- if isinstance(field, relation_fields):
- model_relations.append(field)
- # If model has relations, print them
- if model_relations:
- if not app_header_printed:
- # Lazy print app header
- self.print_app_header(app)
- app_header_printed = True
- # Print model header
- self.print_model_header(model)
- # Finally list model relations
- for field in model_relations:
- self.stdout.write(field_pattern % (
- field.name,
- field.__class__.__name__,
- field.related_model.__name__,
- field.rel.on_delete.__name__,
- ))
- def print_app_header(self, app):
- # Fancy title
- self.stdout.write("\n\n%s" % app.name)
- self.stdout.write('=' * len(app.name))
- def print_model_header(self, model):
- self.stdout.write("\n%s" % model.__name__)
- self.stdout.write('-' * len(model.__name__))
- self.stdout.write("\n")
|