代码之家  ›  专栏  ›  技术社区  ›  mipadi

我如何过滤这些Django记录?

  •  9
  • mipadi  · 技术社区  · 14 年前

    我有一组Django模型,如下图所示(反向关系的名称显示在黄色气泡中):

    Django models
    (来源: cbstaff.com )

    在每一段关系中 Person 可能有0个或多个项目。

    slug 字段不是唯一的;倍数 记录可能有相同的slug字段。基本上,这些记录是重复的。

    我想获得满足以下条件的所有记录的列表:所有重复记录(即,具有相同的slug)至少有一个 Entry 或者至少一个 Audio 或者至少一个 Episode 或者至少一个 Article

    Person.objects.values('slug').annotate(num_records=Count('slug')).filter(num_records__gt=1)
    

    将所有记录按 ,然后添加 num_records 属性,该属性表示有多少条记录具有该段塞,但没有执行额外的筛选(我甚至不知道这是否可以正常工作,因为给定一组重复的记录,其中一条可能具有,例如,和 进入 文章

    简而言之,我想找到所有重复的记录,并将它们连同它们的关联模型一起折叠到一个记录中。

    3 回复  |  直到 5 年前
        1
  •  1
  •   spookylukey    14 年前

    我会在几个查询中这样做。第一个是您的副本列表,您有:

    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])
    
        3
  •  0
  •   Community Egal    7 年前

    我不确定链式过滤器是否能帮你找到你想要去的地方,因为会有Person条目包含两种或更多类型的工件,上面有它们的名字。看一看前面的StackOverflow问题及其答案,我认为这将有助于您以所需的方式将四个查询组合成一个查询集:

    How to combine 2 or more querysets in a Django view?