如何过滤这些Django记录?

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最好的方法是什么?

spo*_*key 1

我会在几个查询中执行此操作。第一个是您的重复项列表,您有:

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)