【发布时间】:2019-01-18 07:45:59
【问题描述】:
我需要在查询集中创建新字段来标记记录是否重复。我将 2 个字段的连接值视为标识符。如果它们在查询集中(连接的字段)中出现的次数超过一次,则该记录被视为重复记录。
首先,在我的查询集上,我从现有的 2 个字段创建另一个字段,即案件编号和听证会日期。他们的输出字段名称是 dupe_id
qs = file.objects.annotate(
dupe_id=Concat(
F('case_no')
, F('hearing_date')
, output_field=CharField()
)
)
然后我测试这个 dupe_id 字段的计数。如果计数大于1,则认为是重复的
dupes = qs.values('dupe_id').annotate(dupe_count=Count('dupe_id')).filter(dupe_count__gt=1)
此时,我现在有了另一个查询集,其中包含来自原始查询集的重复值。以下是从查询集类型的 dupe 对象中看到的记录。它还说明了找到该值的实例数
<QuerySet [{'dupe_id': 'Test Case No.2018-12-26', 'dupe_count': 3}, {'dupe_id': '123452018-12-26', 'dupe_count': 2}]>
现在这是我遇到一些困难的地方。我的想法是,我将在我的主查询集上做一个注释,我将使用 dupes 查询集来帮助识别需要标记为重复的记录。
我试过这个:
qs = qs.annotate(
dupe_id2 = Value(('duplicate' if dupes.filter(dupe_id__exact=Concat(F('case_no'), F('hearing_date')))[0] else '--'), output_field=CharField())
)
这只是一个简单的测试,如果在 dupes 查询集中看到连接的值,则该字段将被标记为重复,如果没有则标记为“--”。
但它似乎没有按预期工作。即使我有 1 条不应该被标记为重复的记录,所有记录都被标记为重复。
我还使用条件表达式进行了检查,但我将无法使用我创建的 dupes 查询集。
如果有更可靠的方法将查询集中的记录标记为重复,请告诉我。
【问题讨论】:
-
为什么要投反对票?