我有以下型号
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"))
这是表deviation_date中的实际数据
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
如果指定的月份和年份介于date_from和date_to之间,我想过滤Destination_Deals。
- 示例1**
月份:9月(09)
年份:2012年
- 想要的出发日期结果:**
ID 3:这是唯一触及09/2012的数据范围
- 示例2**
月份:2月(02)
年份:2013年
- 想要的出发日期结果:**
ID 1:2012年2月在2012年3月之前
因此,日期实际上并不重要。如果月份和年份介于date_from和date_to之间,即使是一天,也必须过滤。
我想我一定要用这样的东西,但我不知道该怎么做。
- ---编辑---*
这是对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>]
4条答案
按热度按时间4jb9z9bj1#
查看文档
使用
.extra
的替代方法:有一种特定的情况,上面的查询没有产生所需的结果。
例如:
那么
%(month)s >= MONTH(date_from)
条件是错误的,因为在date_from
中第1个月〈第11个月,但是年份不同,所以这里需要MySQLIF
条件:wkyowqbh2#
仅使用python代码的解决方案。主要思想是用python构造date_from和date_to。然后这些日期可以在
filter
中与__lte
和__gte
一起使用:现在这将工作:
krugob8w3#
您可以通过使用datetime.timedelta向范围中的最后一个日期添加一天来避免由于
DateTimeField/date
对象比较中缺乏精度而导致的“阻抗不匹配”(如果使用range,则可能发生这种情况)。wvyml7n54#
您可以使用
__gte
和__lte
的2个过滤器: