代码之家  ›  专栏  ›  技术社区  ›  Edgar Navasardyan

django-用查询集左连接日期数组

  •  1
  • Edgar Navasardyan  · 技术社区  · 7 年前

    在我的Django项目中,我有以下模型:

    class Examine(models.Model):
             name = models.CharField(max_length=45)
             date = models.DateField(blank=True, null=True)
    

    我的目标是提出一个查询集,使我能够呈现一个带有日期列表和日期检查(如果有的话)的模板。例如,我在数据库中有三个检查:

    Math - 01 January 2019, 
    History - 03 January 2019
    Geoghraphy - 03 January 2019
    

    我对2019年1月1日至1月4日的日期间隔感兴趣。 输出应为:

    January 1
         Math
    January 2
         No exams
    January 3
         History
         Geography
    January 4
         No exams
    

    我在Django ORM有两年的经验,但我甚至无法提交我如何尝试实现这一点的任何尝试。我不知道。在姜戈有可能吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Anentropic    7 年前

    in the docs here

    from datetime import date
    
    start_date = date(2019, 1, 1)
    end_date = date(2019, 1, 4)
    exams = Examine.objects.filter(date__gte=start_date, date__lte=end_date).order_by('date')
    

    from collections import defaultdict
    
    exams_by_day = defaultdict(list)
    for exam in exams:
        exams_by_day[exam.date].append(exam)
    

    defaultdict

    from datetime import timedelta
    
    date_diff = end - start  # a timedelta object (3 days)
    dates = []
    for i in range(date_diff.days + 1):
        dates.append(start + timedelta(days=i))
    

    <dl>
    {% for date_ in dates %}
        <dt>{{ date_|date:"F j"}}</dt>
        <dd>
            <ol>
            {% with exams=exams_by_date.date %}
            {% for exam in exams %}
                <li>{{ exam.name }}</li>
            {% empty %}
                <li>No exams</li>
            {% endfor %}
            </ol>
        </dd>
    {% endfor %}
    </dl>
    

    https://docs.djangoproject.com/en/2.0/ref/templates/builtins/
    with |date:"F j"