我有一个看起来像这样的数据结构
[{'name': 'sfsdf sdfsdf', 'id': '621205528'},
{'name': 'test name', 'id': '32324234234'},
{'name': 'another name', 'id': '3434535342221'}]
现在我有一个名为Profile的模型,其中字典中的id映射到模型中的uid字段。
我想删除数据库中存在的列表中的每个条目。有没有一种优雅的方法,现在我有一堆for循环,有多个调用数据库,但这可能不是最好的方法。
答案 0 :(得分:1)
您可以一次性从数据库中获取匹配列表,并进行比较:
db_ids = set(Profile.objects.values_list('uid', flat=True))
my_ids = set([d['id'] for d in original_list])
ids_to_keep = my_ids - db_ids
list_to_keep = [l for l in original_list if l['id'] in ids_to_keep]
答案 1 :(得分:1)
ids = [x['id'] for x in my_list]
existing_ids = Profile.objects.filter(id__in=ids).values_list('id', flat=True)
result = filter(lambda elm: elm['id'] in existing_ids, my_list)
答案 2 :(得分:0)
我就是这样做的:
data = [{'name': 'sfsdf sdfsdf', 'id': '621205528'},
{'name': 'test name', 'id': '32324234234'},
{'name': 'another name', 'id': '3434535342221'}]
Profile.objects.filter(id__in=[x['id'] for x in data]).delete()
更加充实的版本:
ids = [x['id'] for x in data] # gives you ['621205528', '32324234234', '3434535342221']
selection = Profile.objects.filter(id__in=ids)
selection.delete()
答案 3 :(得分:0)
首先,您希望从列表中获取该模型的ID列表
id_list = Profile.objects.filter(whaterever filter).values_list('id', flat=True).order_by('id')
如果是整数,这将返回一个列表。
然后从当前列表中删除它:
mylist = [{'name': 'sfsdf sdfsdf', 'id': '621205528'}, {'name': 'test name', 'id': '32324234234'}, {'name': 'another name', 'id': '3434535342221'}]
for counter, tmp in enumerate (mylist):
if int(tmp['id']) in id_list:
id_list.pop(counter)
如果您使用pop,它将修改您现有的列表。如果您不想更改现有列表,也可以创建另一个列表。
答案 4 :(得分:-1)
假设没有数百条记录需要删除,您可以使用以下内容。
objs = [{'name': 'sfsdf sdfsdf', 'id': '621205528'}, ...]
Profile.objects.filter(id__in=[x.get('id') for x in objs]).delete()