Джанго - Модели + Список словарей - PullRequest
1 голос
/ 12 июля 2011

У меня есть структура данных, которая выглядит следующим образом

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

Теперь у меня есть модель с именем Profile, в которой идентификатор в словаре отображается в поле uid в модели.

Я хотел бы удалить каждую запись в списке, которая существует в базе данных.Есть ли элегантный способ сделать это, сейчас у меня есть куча циклов for, которые имеют несколько обращений к БД, но, возможно, это не лучший способ сделать это.

Ответы [ 5 ]

1 голос
/ 12 июля 2011
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)
1 голос
/ 12 июля 2011

Вы можете получить список соответствия из БД за один раз и сравнить:

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]
0 голосов
/ 12 июля 2011

Сначала вы хотите получить список идентификаторов этой модели в списке

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, он изменит ваш существующий список.Если вы не хотите изменять существующий список, вы также можете создать другой список.

0 голосов
/ 12 июля 2011

Предполагая, что нет сотен записей для удаления, вы можете использовать ниже.

objs = [{'name': 'sfsdf sdfsdf', 'id': '621205528'}, ...]

Profile.objects.filter(id__in=[x.get('id') for x in objs]).delete()
0 голосов
/ 12 июля 2011

Вот как бы я это сделал:

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()
...