#! /usr/bin/env python
'''Cleans database from garbage: objects which lost their required relations.'''
import setup_environment
from django.db import connection
from django.db.models.fields.related import RelatedField
from django.core.exceptions import ObjectDoesNotExist
def main(argv=None):
tables = connection.introspection.table_names()
seen_models = connection.introspection.installed_models(tables)
for model in seen_models:
cleanup_model(model)
def cleanup_model(model):
print 'Cleaning ' + str(model) + '...'
#get relational fields:
fields = []
for f in model._meta.fields:
if isinstance(f, RelatedField):
fields.append(f)
for obj in model.objects.all():
for f in fields:
try:
getattr(obj, f.name)
except ObjectDoesNotExist:
print 'Object #%i has unrelated field: %s == %s' % \
(obj.pk, f.name, f.value_from_object(obj))
if f.null == False:
print ' * Removing this object...'
obj.delete()
break
else:
print ' * Fixing object with null value...'
setattr(obj, f.name, None)
if __name__ == '__main__':
main()
Comments