姜戈 ORM。 Select 只有来自数据库的重复字段

Django ORM. Select only duplicated fields from DB

我在数据库中有 table 这样的:

MyTableWithValues
id | user(fk to Users) | value(fk to Values) |   text     | something1 | something2 ...
1  | userobject1       | valueobject1        |asdasdasdasd| 123        | 12321
2  | userobject2       | valueobject50       |QWQWQWQWQWQW| 515        | 5555455
3  | userobject1       | valueobject1        |asdasdasdasd| 12345      | 123213

我需要删除所有包含重复字段 user、valuetext 的对象,但从中保存一个。在此示例中,将删除第 3 条记录。

如何使用 Django ORM 执行此操作?

PS: 试试这个:

recs = (
        MyTableWithValues.objects
        .order_by()
        .annotate(max_id=Max('id'), count_id=Count('user__id'))
        #.filter(count_id__gt=1)
        .annotate(count_values=Count('values'))
        #.filter(count_icd__gt=1)
)
    ...
    ...
    for r in recs:
        print(r.id, r.count_id, , r.count_values)

它打印出如下内容:

1 1 1
2 1 1
3 1 1
...

尽管如此,数据库中存在重复值。我不明白,为什么 Count 函数不起作用。

有人可以帮我吗?

Python 循环对你有用吗?

import collections

d = collections.defaultdict(list)

# group all objects by the key
for e in MyTableWithValues.objects.all():
    k = (e.user_id, e.value_id, e.text)
    d[k].append(e)

for k, obj_list in d.items():
    if len(obj_list) > 1:
        for e in obj_list[1:]:
            # except the first one, delete all objects
            e.delete()

您应该首先了解 count 的工作原理。 Count 方法将计算 相同的行 。 它使用对象中可用的所有字段 来检查它是否与其他行 的字段相同。 所以在目前的情况下 count_values 结果是 1 因为 Count 正在使用除 id[=35= 之外的所有字段] 寻找相似的行。 Count 包括用于检查相似性的 user、value、text、something1、something2 字段。

要计算具有相似字段的行,您必须仅使用用户、值和文本字段

查询:

  recs = MyTableWithValues.objects
         .values('user','values','text')
         .annotate(max_id=Max('id'),count_id=Count('user__id'))
         .annotate(count_values=Count('values'))

它将return一个字典列表

  print(recs)

输出:

<QuerySet[{'user':1,'values':1,'text':'asdasdasdasd','max_id':3,'count_id':2,'count_values':2},{'user':2,'values':2,'text':'QWQWQWQWQWQW','max_id':2,'count_id':1,'count_values':1}]

使用此 queryset 您可以检查 包含具有相同值的用户、值和文本字段的次数