# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models def get_duplicates(model): return [i['mbid'] for i in model.objects.values('mbid').annotate(idcount=models.Count('mbid')).order_by('-idcount') if i['idcount'] > 1] def deduplicate(apps, schema_editor): Artist = apps.get_model("music", "Artist") Album = apps.get_model("music", "Album") Track = apps.get_model("music", "Track") for mbid in get_duplicates(Artist): ref = Artist.objects.filter(mbid=mbid).order_by('pk').first() duplicates = Artist.objects.filter(mbid=mbid).exclude(pk=ref.pk) Album.objects.filter(artist__in=duplicates).update(artist=ref) Track.objects.filter(artist__in=duplicates).update(artist=ref) duplicates.delete() for mbid in get_duplicates(Album): ref = Album.objects.filter(mbid=mbid).order_by('pk').first() duplicates = Album.objects.filter(mbid=mbid).exclude(pk=ref.pk) Track.objects.filter(album__in=duplicates).update(album=ref) duplicates.delete() def rewind(*args, **kwargs): pass class Migration(migrations.Migration): dependencies = [ ('music', '0004_track_tags'), ] operations = [ migrations.RunPython(deduplicate, rewind), ]