Как получить значение словаря из Python?
Сегодня я пытался преобразовать look up в словарь данных... по причинам производительности...
Это почти работает... За исключением того, что он дублирует записи на моем выходе...
Вот мой код, о котором идет речь...
class Calendar(HTMLCalendar):
def __init__(self, year=None, month=None, user=None):
self.user = user
self.year = year
self.month = month
super(Calendar, self).__init__()
# formats a day as a td
# filter events by day
def formatday(self, day, requests):
requests_per_day = DailyPlannerRequest.objects.filter(Q(created_by=self.user)).distinct().order_by('start_time')
daily_planner_events1 = []
for requests in requests_per_day:
requests_per_day_dict = model_to_dict(requests)
daily_planner_events1.append(requests_per_day_dict)
daily_planner_events1 = dict()
events = add_event_dates(requests_per_day)
all_event_dates = []
for event in events:
for date in event.dates:
if date not in all_event_dates and date.month == self.month and date.year == self.year:
all_event_dates.append(date)
for event in events:
for date in event.dates:
if date in all_event_dates and date not in daily_planner_events1 and date.month == self.month and date.year == self.year:
daily_planner_events1[date] = [event]
else:
if date.month == self.month and date.year == self.year:
daily_planner_events1[date].append(event)
# daily_planner_events[date].append(events)
d = ''
for requests in requests_per_day:
for event in daily_planner_events1:
if event.day == day:
d += f'<li> {requests.get_html_url} </li>'
if day != 0:
return f"<td><span class='date'>{day}</span><ul> {d} </ul></td>"
return '<td></td>'
Код выше работает... За исключением того, что он выдает неправильный результат... В частности, проблемный фрагмент...
for requests in requests_per_day:
for event in daily_planner_events1:
if event.day == day:
d += f'<li> {requests.get_html_url} </li>'
Вывод недостаточно конкретен.
Я играл с этим весь день... и другая версия, которая действительно вроде как работает, это...
for event in daily_planner_events1:
if event.day == day:
d += f'<li> {event.get_html_url} </li>'
Если я удалю часть request и заменю request на event, то все работает так, как я хочу, за исключением того, что часть get_html_url теперь не работает. Он не получает доступ к ID из словаря и, насколько я могу судить по тому, как я сравниваю события... у него нет информации о ID, которую можно было бы предоставить. Что я делаю неправильно?
Заранее спасибо за любые мысли.
Ваш код очень запутан и, вероятно, может быть значительно упрощен. Например, daily_planner_events1
используется как список, а затем заменяется на dict()
перед тем, как с ним что-то сделать? Очень трудно рассмотреть ваш вопрос, потому что ваш код не прост и некоторые функции не включены, например add_event_dates
и get_html_url
.
Чтобы попытаться ответить на ваш вопрос, наиболее вероятная причина, по которой вы пытаетесь получить желаемые результаты, заключается в том, что ваши конечные вложенные for-петли не связаны друг с другом должным образом, т.е. они не зацикливаются на связанных объектах. Следовательно, удаление внешнего цикла for помогло, предположительно причина, по которой вы не получаете желаемого результата, заключается в том, что event.get_html_url
возвращает не то, что нужно.
Я просмотрел весь ваш код, чтобы попытаться понять, что происходит, и думаю, что он мог бы быть гораздо более лаконичным. Как я уже упоминал, я не знаю, что делают некоторые функции, и подозреваю, что где-то есть другая модель, поэтому некоторые вещи, возможно, придется изменить:
def formatday(self, day, requests):
# if the day is zero then return an empty table cell, don't run through any more code
if day == 0:
return '<td></td>'
# Q expression isn't needed here
requests_per_day = DailyPlannerRequest.objects.filter(created_by=self.user)...
# repeated checks of self.month and self.year can be done in an ORM filter
all_event_dates = SomeEventModel.filter(
dates__month=self.month,
dates__year=self.year
)
# no idea what this does?
events = add_event_dates(requests_per_day)
d = ''
# remove the if-statement and use another filter
for event in all_event_dates.filter(day=day):
d += f'<li> {event.get_html_url} </li>'
# return your table cell with the list appended
return f"<td><span class='date'>{day}</span><ul> {d} </ul></td>"
После недели проб и ошибок... оказалось, что мне нужно добавить .date() в цикл, чтобы все заработало.
for event in requests_per_day:
for request in daily_planner_events1:
if request.day == day and request == event.start_time.date():
d += f'<li> {event.get_html_url} </li>'