Django - 模型+词典列表

时间:2011-07-12 15:55:15

标签: python django django-models

我有一个看起来像这样的数据结构

[{'name': 'sfsdf sdfsdf', 'id': '621205528'},
 {'name': 'test name', 'id': '32324234234'},
 {'name': 'another name', 'id': '3434535342221'}]

现在我有一个名为Profile的模型,其中字典中的id映射到模型中的uid字段。

我想删除数据库中存在的列表中的每个条目。有没有一种优雅的方法,现在我有一堆for循环,有多个调用数据库,但这可能不是最好的方法。

5 个答案:

答案 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()