2012-01-11 115 views
1

我有一个字典是这样的:如何过滤基于python中的字典值的日期范围,否则按字典过滤列表?

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]) 

由此字典将导致动态变化的范围内引用的PK。我没有发现任何暗示这是可能的或有效的,所以我猜测下一个最好的办法是通过消除日期范围过滤器,然后使用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 
+0

你能解释一下你所说的“一个动态改变的参考pk范围”吗? – aganders3 2012-01-11 23:56:07

+0

也许这是错误的术语,但我想在(2009,21,9,0,24)和(2010,25,9,10,24)之间过滤client.pk = 17的所有记录。然后对于(2011,12,1,19,39,16)和(2012,1,11,17,39,16)之间的client.pk = 19等。 – 2012-01-12 00:04:33

回答

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关系。

希望这有效,如果没有,你可以请你的模型代码?

+0

我得到:“TypeError:int()argument必须是字符串或数字,而不是'list'“。见上面,我为你添加了一些背景。另外,(对不起,我是一个Python的newby),我有类似的工作,使用for语句循环查询每个客户端记录的方法,但对于大型客户端列表花费了大量的时间。这种解决方案的工作方式是这样吗? – 2012-01-12 03:03:53

+0

我不确定错误来自哪里。你能发布完整的堆栈跟踪吗?是的,这个方法会为每个客户做一个单独的查询,但我不确定是否有更好的方法来做到这一点。当它成为一个问题时,我只会担心绩效。 – aganders3 2012-01-12 14:55:35

+0

显然,昨晚我试过时已经太晚了,现在工作正常。不知道为什么问题提前。谢谢。 – 2012-01-12 15:14:19