gpt4 book ai didi

django - 如何过滤这些Django记录?

转载 作者:行者123 更新时间:2023-12-04 04:39:30 25 4
gpt4 key购买 nike

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

Django models
(来源:cbstaff.com)

在每种关系中,Person可能包含0个或多个项目。

此外,slug字段(不幸的是)不是唯一的;多个Person记录可能具有相同的Slug字段。这些记录本质上是重复的。

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

到目前为止,我有以下查询:

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

这将所有记录按 slug分组,然后添加一个 num_records属性,该属性指示有多少条记录有该段记录,但未执行其他过滤(而且我什至不知道这是否行得通,因为给定了一组重复项记录中,一个可能具有,和 Entry,另一个可能具有 Article

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

用Django实现此目的的最佳方法是什么?

最佳答案

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

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])

关于django - 如何过滤这些Django记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3048401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com