Как объединить все аргументы в двух списках, если первый элемент каждого списка один и тот же

setting = Subject.objects.annotate(A_setup=Count('id', filter=Q(type='A'), distinct=True) * Value(50),
                      B_setup=Count('id', filter=Q(type='B'), distinct=True) * Value(30),
                      C_setup=Count('id', filter=(~Q(type='A') & ~Q(type='B') & ~Q(type__isnull=True) & Q(id__in=workers.filter(worker=1).values('id')))) * Value(10)) \
            .values('setting__user_id', 'A_setup', 'B_setup', 'C_setup')

setting = [{'setting__user_id': 4, 'A_setting': 50.0, 'B_setting': 120, 'C_setting': 10.0}, {'setting__user_id': 34, 'A_setting': 0.0, 'B_setting': 0, 'C_setting': 0.0}, {'setting__user_id': 33, 'A_setting': 0.0, 'B_setting': 150, 'C_setting': 0.0}, {'setting__user_id': 30, 'A_setting': 0.0, 'B_setting': 150, 'C_setting': 0.0}, {'setting__user_id': 74, 'A_setting': 50.0, 'B_setting': 120, 'C_setting': 10.0}]


uploader = Feedback.objects           .values('uploader_id').distinct().values_list('uploader_id')
uploader = [{'uploader_id': 25}, {'uploader_id': 20}, {'uploader_id': 74}, {'uploader_id': 34}, {'uploader_id': 93}, {'uploader_id': 88}, {'uploader_id': 73}, {'uploader_id': 89}, {'uploader_id': 30}, {'uploader_id': 33}, {'uploader_id': 85}, {'uploader_id': 4}, {'uploader_id': 46}]

"setting" выводит только тех пользователей, которые удовлетворяют условиям. Но мне нужен список всех пользователей. "uploader" - это queryset, содержащий всех пользователей. Сначала выводится весь список пользователей, и если id пользователя включен в "настройку", то выводится значение настройки. Конечный результат, которого я хочу добиться, выглядит следующим образом.

Desired Result: [['25', '0', '0', '0'], ['20', '0', '0', '0'], ['74', '50', '120', '10'], ['34', '0', '0', '0'], ['93', '0', '0', '0'], ['88', '0', '0', '0'], ['73', '0', '0', '0'], ['89', '0', '0', '0'], ['30', '0', '150', '0'], ['33', '0', '150', '0'], ['35', '0', '0', '0'], ['4', '50', '120', '10'], ['46', '0', '0', '0']]

извините. Пожалуйста, проверьте еще раз. Есть два набора запросов. Я хочу получить значения A_setup, B_setup, C_setup настройки, если идентификатор загрузчика и идентификатор загрузчика настройки одинаковы после разворачивания кверисета uploader, и добавить 0, если в настройке нет идентификатора загрузчика. Как мне получить желаемые результаты?

На мой взгляд, лучше немного изменить структуру данных (в setting_new и uploader_ids ниже), а затем использовать понимание списка:

from operator import itemgetter

# setting = [{'setting__user_id': 4, 'A_setting': 50.0, 'B_setting': 120, 'C_setting': 10.0}, ...
# uploader = [{'uploader_id': 25}, {'uploader_id': 20}, {'uploader_id': 74}, ...

setting_new = {dct['setting__user_id']: itemgetter('A_setting', 'B_setting', 'C_setting')(dct) for dct in setting}
uploader_ids = map(itemgetter('uploader_id'), uploader)

output = [[i, *setting_new.get(i, (0,0,0))] for i in uploader_ids]
print(output)
# [[25, 0, 0, 0], [20, 0, 0, 0], [74, 50.0, 120, 10.0], [34, 0.0, 0, 0.0], ...
Вернуться на верх