姜戈 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、value 和 text 的对象,但从中保存一个。在此示例中,将删除第 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 您可以检查 行 包含具有相同值的用户、值和文本字段的次数
我在数据库中有 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、value 和 text 的对象,但从中保存一个。在此示例中,将删除第 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 您可以检查 行 包含具有相同值的用户、值和文本字段的次数