【问题标题】:How to filter a query using the max(date) value如何使用 max(date) 值过滤查询
【发布时间】:2013-08-08 08:37:58
【问题描述】:

我有这个模型:

class LogBook_audit(models.Model):
    id             = models.AutoField(primary_key=True)
    logbook        = models.ForeignKey(LogBook, verbose_name='Logbook Control No.')
    username       = models.ForeignKey(User, null=True, blank=True,  verbose_name='Username')
    status         = models.CharField(null=False, blank=False, max_length=40, choices=STATUS_TYPE, default=u'CHECKING REQUIREMENTS', verbose_name='Status')
    log_in         = models.DateTimeField(default=lambda:datetime.now(), verbose_name='Work start')

我正在尝试创建一个查询集来查找登录此类特定日志和状态的最新用户。

view.py

​​>
undolink(request, pk):
    undo_rec     = LogBook.objects.get(pk=pk)
    latest_user  = LogBook_audit.objects.filter(logbook_id=pk, status=undo_rec.status).aggregate(Max('log_in'))
...

但是 latest_user 给了我一个最新的登录格式。我在想我可以使用latest_user.username 但失败了。有没有办法找到那个用户名?任何指南都非常感谢。

【问题讨论】:

    标签: django datetime aggregate


    【解决方案1】:

    您可以改用latest()

    latest_log = LogBook_audit.objects.filter(logbook_id=pk, status=undo_rec.status).latest('log_in')
    

    那么你就可以通过latest_log.user访问用户了。

    【讨论】:

    • 我从没想过查询集中有这样的方法。与Joe Holloway 给出的第一条记录相比,结果给了我一个用最少编码的最新记录。
    • 这个答案来自 2009 年 8 月。从那时起,Django 发生了很多变化。
    • latest() 是他们的任何功能像oldest()
    • @PiyushS.Wanare 你可以使用earliest()
    【解决方案2】:

    你想得到一个查询集结果,所以你应该使用annotate():

    latest_user = (LogBook_audit.objects
                   .filter(logbook_id=pk, status=undo_rec.status)
                   .annotate(max_log_in=Max('log_in')))
    

    希望对你有帮助。

    【讨论】:

    • 结果给了我3条记录,相当于logbook_id和status。我仍然需要在这 3 个中找到最大 log_in。print latest_user[0],max_log_inprint latest_user[1].max_log_inprint latest_user[2].max_log_in
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多