Django基于F('pk')从字典获取失败,因为它需要int或slice,而不是F?

2024-06-28 20:05:39 发布

您现在位置:Python中文网/ 问答频道 /正文

这让我很困惑

我想制作重复事件,所以我决定使用Django的RecurrenceField,然后意识到没有办法在字段上进行过滤。为了得到即将到来的事件,我必须做很多查询,而不是仅仅是一个最小的,这让我发疯。下面是我起草的用于获取即将到来的事件的函数(该函数不起作用)

def get_future_events():
    future_events = None

    non_recurring_today_events = Events.objects.filter(is_deleted=False, status='Live', event_date=timezone.now().date(), event_time__gt=datetime.now(), recurrences__isnull=True).annotate(next_date=F('event_date')).order_by('event_date', 'event_time')
    non_recurring_future_events = Events.objects.filter(is_deleted=False, status='Live', event_date__gt=timezone.now().date(), recurrences__isnull=True).order_by('event_date', 'event_time')
    future_events = non_recurring_today_events | non_recurring_future_events


    recurring_events_ids_for_future = list()
    recurring_events_dates = dict()

    recurring_events = Events.objects.filter(is_deleted=False, status='Live', event_time__gt=datetime.now(), recurrences__isnull=False).order_by('event_time');

    for event in recurring_events:
        if(event.recurrences.count(dtstart=datetime.now()) > 0):
            recurring_events_ids_for_future.append(event.event_id)
            recurring_events_dates[event.pk] = event.recurrences.after(datetime.now(),inc=True)

    # This line gives the error:
    recurring_events_for_future = Events.objects.filter(is_deleted=False,event_id__in=recurring_events_ids_for_future).annotate(next_date=recurring_events_ids_for_future[F('pk')]).order_by('next_date', 'event_time')

    future_events = future_events | recurring_events_for_future
    future_events = future_events.order_by('next_date', 'event_time')

    return future_events

我以为我可以走了,但后来我犯了一个错误: list indices must be integers or slices, not F

如果有人有其他想法,请帮助我。先谢谢你

以下是事件模型中的重要字段:

class Events(models.Model):
    event_id = models.BigAutoField(primary_key=True)
    event_date = models.DateField(null=True)
    event_time = models.TimeField(null=True)
    TYPE = (('Live', 'Live'), ('Archived', 'Archived'))
    status = models.CharField(choices=TYPE, max_length=50, default='Live')
    recurrences = RecurrenceField(null=True, blank=True)
    is_deleted = models.BooleanField(default=False)

注意:非经常性事件的RecurrenceField为None/null


Tags: eventlivefalsetruefordatetimemodels