Я хочу сделать перекрестную ссылку на словарь и набор запросов django, чтобы определить, какие элементы имеют уникальные значения dictionary['name']
и djangoModel.name
соответственно.Теперь я делаю это следующим образом:
- Создайте список значений словаря ['name']
- Создайте список значений djangoModel.name
- Создание списка уникальных значений путем проверки на включение в эти списки
Это выглядит следующим образом:
alldbTests = dbp.test_set.exclude(end_date__isnull=False) #django queryset
vctestNames = [vctest['name'] for vctest in vcdict['tests']] #from dictionary
dbtestNames = [dbtest.name for dbtest in alldbTests] #from django model
# Compare tests in protocol in fortytwo's db with protocol from vc
obsoleteTests = [dbtest for dbtest in alldbTests if dbtest.name not in vctestNames]
newTests = [vctest for vctest in vcdict if vctest['name'] not in dbtestNames]
Неуместно создавать промежуточный список имен(строки 2 и 3 выше), просто чтобы иметь возможность проверить включение сразу после.Я что-то пропустил?Я полагаю, я мог бы поместить два списка в одну строку, например, так:
obsoleteTests = [dbtest for dbtest in alldbTests if dbtest.name not in [vctest['name'] for vctest in vcdict['tests']]]
Но за этим, похоже, сложнее следить.это:
# vcdict is a list of django models where the following are all true
alldBTests[0].name == 'test1'
alldBTests[1].name == 'test2'
alldBTests[2].name == 'test4'
dict1 = {'name':'test1', 'status':'pass'}
dict2 = {'name':'test2', 'status':'pass'}
dict3 = {'name':'test5', 'status':'fail'}
vcdict = [dict1, dict2, dict3]
Я не могу преобразовать в наборы и взять разницу, если я не урежу вещи до только строки имени, но затем я потеряю доступ к остальной части модели / словаря, верно?Только наборы сработали бы, если бы в обоих случаях у меня был один и тот же тип объекта.