如何根据字典值在Python中过滤日期范围,否则根据字典过滤列表?

1 投票
1 回答
1810 浏览
提问于 2025-04-17 10:03

我有一些字典,长得像这样:

s_dates_dict = {17: datetime.date(2009,21,9,0,24), 19: datetime.datetime(2011,12,1,19,39,16), ....}  
e_dates_dict = {17: datetime.date(2010,25,9,10,24), 19: datetime.datetime(2012,1,11,17,39,16), ....}

我想用这些字典来找到每条记录之后的下一个类型(A或B)的记录,时间是在某个日期之后。所以我觉得我最好是创建一个类似下面的查询:

next_record_list = Tasks.objects.filter(date__range(s_dates_dict,e_dates_dict), client__in=client_list, task_type__in=[A,B])  

这样字典就能动态地改变引用的主键范围。我没有找到任何建议说这样做是可能的或者高效的,所以我猜下一个最好的办法就是先创建一个列表,去掉日期范围的过滤,然后用一个for循环遍历最旧值的字典,在dates_dict中提到的日期处停止遍历每条记录。但我也还没找到实现这个的方法。能不能给我一些建议,或者完全不同的更好的方法?谢谢。

编辑:

client_list是一个客户对象的列表。

这是一些models.py的内容:

class Client(models.Model):
    user_name = models.CharField

class Task(models.Model):
    client = models.ForeignKey(
                               'Client',
                               )
    task_type = models.ForeginKey(
                                  'Task_Type',
                                  )
    date = models.DateTimeField(
                                 default = datetime.now(),
                                 blank = True,
                                 null = True,
                                 )

class Task_Type(models.Model):
    name = models.CharField  

1 个回答

0

我想我现在明白了。我假设 client_list 实际上是一个客户对象的列表。虽然可能有人会想出更有效的解决方案,但我会尝试这样的做法:

next_record = {}
for client in client_list:
    s = s_dates_dict[client.pk]
    e = e_dates_dict[client.pk]
    next_record[client.pk] = client.tasks_set.filter(date__range(s,e), task_type__in=[A,B])

这样你就得到了一个字典(next_record),其中每个键对应一个任务列表。我假设你的 TasksClient 模型之间有一个 ForeignKey 的关系。

希望这个方法有效,如果不行的话,能不能请你把你的模型代码发出来?

撰写回答