mip*_*adi 9 django django-models
我有一组Django模型,如下图所示(反向关系的名称显示在黄色气泡中):
Django模型http://mipadi.cbstaff.com/images/misc/people_django.jpg
在每个关系中,a Person可以具有0个或更多个项目.
此外,该slug领域(不幸的是)不是唯一的; 多个Person记录可能具有相同的段塞字段.基本上这些记录是重复的.
我想获得满足以下条件的所有记录的列表:所有重复记录(即具有相同的段塞),其中至少一个EntryOR至少一个AudioOR至少一个EpisodeOR至少一个Article.
到目前为止,我有以下查询:
Person.objects.values('slug').annotate(num_records=Count('slug')).filter(num_records__gt=1)
Run Code Online (Sandbox Code Playgroud)
这将所有记录分组slug,然后添加一个num_records属性,说明有多少记录有那个slug,但是没有执行额外的过滤(我甚至不知道这是否会正常工作,因为,给定一组重复记录,一个人可能有,例如,和Entry另一个人可能有a Article).
简而言之,我想找到所有重复的记录,并将它们及其相关模型折叠到一个记录中.
使用Django最好的方法是什么?
我会在几个查询中执行此操作。第一个是您的重复项列表,您有:
dupes = [p['slug'] for p in Person.objects.values('slug').annotate(num_records=Count('slug')).filter(num_records__gt=1)]
Run Code Online (Sandbox Code Playgroud)
然后我会循环遍历这些,并为每个决定保留哪个(做出任意决定 - 选择第一个)。然后,对于所有其他主键,只需更新所有其他对象以指向您选择的主键:
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])
Run Code Online (Sandbox Code Playgroud)