我有下列型号
class Destination_Deal(models.Model):
name = models.CharField(_("Nombre"),max_length=200)
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"))
这是出发日期表中的实际数据
id date_from date_to destination_deal_id
1 2012-11-01 2013-03-17 1
2 2012-11-01 2012-12-16 2
3 2012-09-16 2012-10-31 3
4 2012-11-01 2012-12-16 3
5 2013-01-04 2013-01-11 4
如果指定的月份和年份介于起始日期和结束日期之间,我想筛选目标交易。
示例1
Month: September (09)
Year: 2012
想要的出发日期结果:
ID 3:这是唯一一个触及09/2012的数据范围
示例2
Month: February (02)
Year: 2013
想要的出发日期结果:
ID 1:02/2012在03/2012之前
所以,日子其实并不重要。如果月份和年份介于日期从和日期到之间,即使是在某一天,也必须进行筛选。
我想我必须用一些类似this的东西,但我不知道怎么做。
提前谢谢! 米格尔
---编辑---
这是对来自Aamir Adnan的答案的测试,但它没有像我预期的那样工作,因为ID 1也必须返回,因为它从2012年11月到2013年3月,所以2013年1月介于两者之间。
Departure_Date.objects.all()
[<Departure_Date: id: 1 - from: 2012-11-01 - to: 2013-03-17>,
<Departure_Date: id: 2 - from: 2012-11-01 - to: 2012-12-16>,
<Departure_Date: id: 3 - from: 2012-09-16 - to: 2012-10-31>,
<Departure_Date: id: 4 - from: 2012-11-01 - to: 2012-12-16>,
<Departure_Date: id: 5 - from: 2013-01-04 - to: 2013-01-11>]
month:1
year:2013
where = '%(year)s >= YEAR(date_from) AND %(month)s >= MONTH(date_from) \
AND %(year)s <= YEAR(date_to) AND %(month)s <= MONTH(date_to)' % \
{'year': year, 'month': month}
Departure_Date.objects.extra(where=[where])
[<Departure_Date: id: 5 - from: 2013-01-04 - to: 2013-01-11>]
只使用python代码的解决方案。主要思想是用python构造date_from和date_to。然后,这些日期可以与
__lte
和__gte
一起在filter
中使用:现在这将起作用:
检查documentation
使用
.extra
的替代方法:有一个特定的情况,上面的查询没有产生所需的结果。
例如:
那么
%(month)s >= MONTH(date_from)
条件是错误的,因为date_from
中的第1个月是<;第11个月,但年份不同,所以这里需要MySQLIF
条件:通过使用datetime.timedelta将一天添加到范围中的最后一天,可以避免由于
DateTimeField/date
对象比较中缺少精度而导致的“阻抗不匹配”。其工作原理如下:相关问题 更多 >
编程相关推荐