use*_*652 213 python django django-models django-queryset
我在一个模型中有一个字段
class Sample(models.Model):
date = fields.DateField(auto_now=False)
Run Code Online (Sandbox Code Playgroud)
现在,我需要按数据范围过滤对象,例如,2011年1月1日到2011年1月31日之间的所有对象?
谢谢你的帮助!
cro*_*jer 362
使用
Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])
Run Code Online (Sandbox Code Playgroud)
或者,如果您只是想逐月过滤:
Sample.objects.filter(date__year='2011',
date__month='01')
Run Code Online (Sandbox Code Playgroud)
正如Bernhard Vallant所说,如果你想要一个排除specified range ends你的查询集,你应该考虑他的解决方案,它使用gt/lt(大于/小于).
Ber*_*ant 172
你可以使用djangofilter与datetime.date对象:
import datetime
samples = Sample.objects.filter(sampledate__gte=datetime.date(2011, 1, 1),
sampledate__lte=datetime.date(2011, 1, 31))
Run Code Online (Sandbox Code Playgroud)
小智 76
使用过滤器执行django范围时,请确保您知道使用日期对象与日期时间对象之间的区别.__range包含日期,但如果您使用datetime对象作为结束日期,则如果未设置时间,则不包括该日的条目.
startdate = date.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
Run Code Online (Sandbox Code Playgroud)
返回从startdate到enddate的所有条目,包括那些日期的条目.不好的例子,因为这是将来一周返回的条目,但你得到了漂移.
startdate = datetime.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
Run Code Online (Sandbox Code Playgroud)
将缺少24小时的条目,具体取决于日期字段的设置时间.
tro*_*jer 18
您可以解决由于DateTimeField/date对象比较缺乏精确性而导致的"阻抗不匹配" - 如果使用范围可能会发生- 通过使用datetime.timedelta在该范围内添加一天到最后一个日期.这就像:
start = date(2012, 12, 11)
end = date(2012, 12, 18)
new_end = end + datetime.timedelta(days=1)
ExampleModel.objects.filter(some_datetime_field__range=[start, new_end])
Run Code Online (Sandbox Code Playgroud)
如前所述,如果不执行此类操作,则会在最后一天忽略记录.
编辑以避免使用datetime.combine- 在与a进行比较时坚持使用日期实例似乎更合乎逻辑DateTimeField,而不是弄乱一次性(和令人困惑的)datetime对象.请参阅以下评论中的进一步说明
Ahm*_*udi 12
您可以使用“__range”例如:
from datetime import datetime
start_date=datetime(2009, 12, 30)
end_date=datetime(2020,12,30)
Sample.objects.filter(date__range=[start_date,end_date])
Run Code Online (Sandbox Code Playgroud)
为了使其更加灵活,您可以设计一个FilterBackend,如下所示:
class AnalyticsFilterBackend(generic_filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
predicate = request.query_params # or request.data for POST
if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is not None:
queryset = queryset.filter(your_date__range=(predicate['from_date'], predicate['to_date']))
if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is None:
queryset = queryset.filter(your_date__gte=predicate['from_date'])
if predicate.get('to_date', None) is not None and predicate.get('from_date', None) is None:
queryset = queryset.filter(your_date__lte=predicate['to_date'])
return queryset
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
236393 次 |
| 最近记录: |