Django ORM。仅从数据库中选择重复的字段
我在DB中有如下表格: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
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、value和text的对象,但从中保存一个。在此示例中,将删除第三条记录
如何使用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,我需要一个高速代码:)