我会在几个查询中这样做。第一个是您的副本列表,您有:
dupes = [p['slug'] for p in Person.objects.values('slug').annotate(num_records=Count('slug')).filter(num_records__gt=1)]
然后我会循环浏览这些,并为每一个决定保留哪一个(做一个任意的决定-选择第一个)。然后,对于所有其他主键,只需更新所有其他对象以指向选定的主键:
for slug in dupes:
pks = [p.id for p in Person.objects.filter(slug=slug)]
for pk in pks[1:]:
Audio.objects.filter(person=pk).update(person=pks[0])
Author.objects.filter(person=pk).update(person=pks[0])
Episode.objects.filter(person=pk).update(person=pks[0])
Entry.objects.filter(person=pk).update(person=pks[0])