2013-01-10 79 views
-2

之间的周末,我有以下型号:Django的过滤器,如果范围

class Destination_Deal(models.Model): 
    name = models.CharField(_("Nombre"),max_length=200) 
    duration = models.IntegerField(_(u"Días")) 

class Departure_Date(models.Model): 
    date_from= models.DateField(_('Desde'))  
    date_to= models.DateField(_('Hasta')) 
    destination_deal = models.ForeignKey(Destination_Deal,verbose_name = _("Oferta de Destino")) 

我想过滤目的的交易,适合在一个周末旅行。这意味着:

出发日=周五或周六
返回日期=星期日。因此,如果出发日是星期五或星期六,则持续时间必须为3或2。


Destination_Deal 
id name  duration 
1 Deal1  3 
2 Deal2  5 
3 Deal3  2 
4 Deal4  7 


Departure_Date 
id date_from date_to  destination_deal_id 
1 2012-11-05 2012-11-15 1 
2 2012-11-01 2012-12-16 2 
3 2013-01-21 2013-01-27 3 
4 2013-01-14 2013-01-18 3 
5 2013-01-04 2013-01-11 4 

所需的结果
ID1: 2012年11月9日是星期五和处理的时间是3。因此,在这种情况下,周五,周六和周日符合一个有效的周末。

ID3: 2013年1月26日星期六,本次交易的期限为2年。同样有效。

- 编辑 -
好的,对不起,如果我不清楚。我需要根据上述周末规则过滤目的地优惠。我正在考虑通过将date_from从模型(DateField)转换为python(datetime)来实现,迭代它直到date_to并使用weekday()函数来检查它是星期五还是星期六。

我知道django weekday函数,但它只会在特定的日期(无范围)上工作,所以我想知道是否有更简单的方法适用于此场景。

+2

什么是你的问题?你有什么尝试? –

+0

问题是:“我想筛选适合周末旅行的目的地优惠。”我会更新我的帖子。 –

+0

这不是一个问题。你需要展示或解释你已经试图解决这个问题,然后问一个具体的问题,说明为什么你已经尝试过的东西没有工作。如果你坚持不了解如何解决问题的方法,那么就要弄清楚你需要回答哪些具体问题,以便制定一种方法,然后提出问题。 (编辑:它看起来像你已经详细阐述了一下你的编辑,所以我会看看) –

回答

0
where = '(deparure_date__date_from - deparure_date__date_to) > 4 || \ 
     DAYOFWEEK(deparure_date__date_from) IN (1, 6, 7) || \ 
     DAYOFWEEK(deparure_date__date_to) IN (1, 6, 7)' 

Destination_Deal.objects.filter(duration__in=[1, 2, 3]) \ 
         .extra(where=[where]) 
  • 如果持续时间在1,2,3
  • 而如果date_fromdate_to> 4,则肯定有将是要么星期五或星期六或星期天之间的差异。
  • 或检查date_from是星期五或星期六或星期日
  • date_to是星期五或星期六或星期日
+0

好吧,我知道这可能有点混淆,但date_from和date_to只符合出发日期的范围(而不是离开和返回)。因此,在Deal1中,需要检查2012-11-05,2012-11-06,2012-11-07 ... 2012-11-15,以检查它是否具有星期五或星期六作为有效出发日和持续时间是3或2. –

+0

要了解更多信息,请更新您的数据,因为Deal4的持续时间为3,但from_date和to_date不符合标准。 –

+0

Deal4的持续时间为7。Deal2和Deal4不符合标准,这就是我仅在“Desired Result”中写入的原因ID1和ID3 –