Django ORM。仅从数据库中选择重复的字段

Django ORM。仅从数据库中选择重复的字段,django,python-3.x,django-orm,Django,Python 3.x,Django Orm,我在DB中有如下表格: MyTableWithValues id | user(fk to Users) | value(fk to Values) | text | something1 | something2 ... 1 | userobject1 | valueobject1 |asdasdasdasd| 123 | 12321 2 | userobject2 | valueobject50 |QWQWQWQ

我在DB中有如下表格:

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
1 1 1
2 1 1
3 1 1
...
我需要删除所有重复字段user、valuetext的对象,但从中保存一个。在此示例中,将删除第三条记录

如何使用Django ORM实现这一点

附言: 试试这个:

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)
它打印出如下内容:

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
1 1 1
2 1 1
3 1 1
...
事实上,数据库中存在重复的值。我不明白,为什么计数功能不工作


有人能帮我吗?

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\u值将产生1,因为count使用除id之外的所有字段来查找类似的行。 计数包括用户、值、文本、something1、something2字段,以检查相似性

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

查询:

  recs = MyTableWithValues.objects
         .values('user','values','text')
         .annotate(max_id=Max('id'),count_id=Count('user__id'))
         .annotate(count_values=Count('values'))
它将返回一个字典列表

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

我可以使用它,但是数据库查询比python代码快得多。我有数千个值的DB,我需要一个高速代码:)