Как получить значение словаря из 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>'
Вернуться на верх