【问题标题】:django search DateTime in between two dates from databasedjango 在数据库中的两个日期之间搜索 DateTime
【发布时间】:2016-08-15 13:12:56
【问题描述】:

我正在尝试从数据库中搜索并列出两个日期之间的日期,但不知道该怎么做??

models.py

...
class ProductsTbl(models.Model):
    created = models.DateTimeField(editable=False)
...

views.py

def search(request):
    error = False
    if 'q1' and 'q2'in request.GET:
        q = request.GET['q1','q2']
        if not q:
            error = True
        else:
            books = ProductsTbl.objects.filter(created__range=q)
            return render(request, 'search_results.html',
                {'books': books, 'query': q})
    return render(request, 'search_form.html', {'error': error})

我查了stackoverflow here,但不明白怎么做

我应该在 models.py 中再添加一个 DateTimeField 来帮助搜索吗??

实际上我可以在 python manage.py shell 中做到这一点,但我怎样才能让它在网络上工作?

我的

search_form.html

<form action="" method="get">
<table style="width:30%">
<tr>
<td><input type="text"  class="datepicker" name="q1"> </td>
<td style="width:5%"> between </td>
<td><input type="text"  class="datepicker" name="q2"></td>
<br>
<td><input type="submit" value="Search"></td>
</tr>
</table>
</form>

search_results.html

{% if books %}
<p>Found {{ books|length }} product{{ books|pluralize }}.</p>
<ul>
{% for book in books %}
<li>{{ book.created }}</li>
<h2><a href="{% url 'thing_detail' slug=book.slug %}">{{ book.name }}</a></h2>
{% endfor %}
</ul>
{% else %}
<p>No products matched your search criteria.</p>
{% endif %}

如果只过滤一个日期,我可以使用它

views.py

def publish(request):
    error = False
    if 'q' in request.GET:
        q = request.GET['q']
        if not q:
            error = True
        else:
            books = ProductsTbl.objects.filter(release__icontains=q)
            return render(request, 'publish_results.html',
                {'books': books, 'query': q})
    return render(request, 'publish_form.html', {'error': error})

然而,,,when 出现在两个日期范围之间,,,我不知道该怎么做

【问题讨论】:

  • 您是否遇到任何错误?有什么问题?
  • 网络上没有错误,但我无法过滤两个日期时间之间的日期

标签: django django-models django-views


【解决方案1】:

你快到了,你只需要正确使用__range测试。

首先,将您的字符串转换为日期时间,例如:

import datetime

date_from = datetime.datetime.strptime(request.GET['q1'], '%Y-%m-%d')
date_to = datetime.datetime.strptime(request.GET['q2'], '%Y-%m-%d')

这里的挑战是确保字符串格式正确(例如,我在上面的示例中使用了“%Y-%m-%d”,例如“2016-04-22”)。

第二,您的屏幕截图中显示的错误是因为您创建的日期时间没有指定时区,但数据库中的值确实有时区。 Python 显示错误,因为它无法比较两者。

您可以在documentationthis answer here 中了解此内容。

最后,应用范围如下:

books = ProductsTbl.objects.filter(created__range=(date_from, date_to))

【讨论】:

    【解决方案2】:

    使用此查询获取两个日期范围的结果...

    首先从搜索查询字符串中获取两个日期并在此处应用。

    ProductsTbl.objects.filter(created__range=["2016-04-06", "2016-08-30"])
    

    【讨论】:

    • 我补充说: date_from = datetime.datetime.strptime(request.GET['q1'], 'yy-mm-dd'),,,,and,,,, date_to = datetime.datetime .strptime(request.GET['q2'], 'yy-mm-dd'),,,, books = ProductsTbl.objects.filter(created__range=['date_from','date_to']),, 但没有工作
    【解决方案3】:

    感谢每一位回复我的人,,,我解决了问题,,这是新的

    views.py

    def search(request):
        error = False
        if 'q1' and 'q2'in request.GET:
            q1 = request.GET['q1']
            q2 = request.GET['q2']
            if not q1:
                error = True
            elif not q2:
                error = True
            else:
                books = ProductsTbl.objects.filter(created__range=(q1,q2))
                return render(request, 'search_results.html',
                    {'books': books })
        return render(request, 'search_form.html', {'error': error})
    

    现在我可以过滤和列出范围日期

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2015-07-01
      • 2020-02-06
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多