在Django中基于过滤列提取最新记录的Queryset

时间:2017-06-20 08:53:18

标签: python django sqlite django-queryset

编辑

我从stackoverflow和django文档搜索了我的问题的解决方案,但没有运气。我的模特:

class User(models.Model):
    name = models.CharField(max_length=10)
    type = models.CharField(max_length=10)

class Userlog(models.Model):
    user = models.ForeignKey('User', related_name='userlog')
    pc_type = models.CharField(max_length=10)
    login_date = models.DateField()

下表是Django app中我的sqlite表的简化版本:

用户:

+----+------+---------+
| ID | User |  Type   |
+----+------+---------+
| 1  | A    | Admin   |
| 2  | B    | Admin   |
| 3  | C    | User    |
+----+------+---------+

用户日志:

+----+---------+------------+------------+
| ID |  user   |  pc_type   | login_date |
+----+---------+------------+------------+
| 1  | A       |   Desktop  | 2017/01/01 |
| 2  | A       |   Server   | 2017/01/05 |
| 3  | B       |   Desktop  | 2017/01/11 |
| 4  | A       |   Server   | 2017/02/03 |
| 5  | C       |   Desktop  | 2017/02/09 |
| 6  | B       |   Server   | 2017/02/21 |
| 7  | A       |   Desktop  | 2017/03/18 |
| 8  | C       |   Desktop  | 2017/03/31 |
+----+---------+------------+------------+

我尝试了不同的方法:

q = Userlog.objects.values('login_date').annotate(last_date =\ Max('login_date')).filter(pc_type='Desktop', user='Admin', login_date=F('last_date'))

但无法提取已过滤列的最新日期。

我需要Django QuerySet表达式来获得下面的结果: (使用桌面记录的管理员的最新登录日期)

+----+---------+------------+------------+
| ID | User_ID |   pc_type  | login_date |
+----+---------+------------+------------+
| 3  | B       |   Desktop  | 2017/01/11 |
| 7  | A       |   Desktop  | 2017/03/18 |
+----+---------+------------+------------+

我发现了类似的question,但我想使用django表达式。

2 个答案:

答案 0 :(得分:2)

In Django documentation您可以阅读有关annotate的更多信息。

但在你的情况下,试试:

User.objects\
.filter(type='Admin', user_log__pc_type='Desktop')\
.annotate(last_login_date=Max('user_log__login_date'))
  • 使用.filter - 您可以过滤所需的记录
  • 使用.annotate - 您将获得最长登录日期

要准确运行此代码,您需要related_name='user_log'表示UserUserLog之间的关系:

class UserLog(models.Model)
    user = models.ForeignKey(User, related_name='user_log')
    ...

答案 1 :(得分:1)

尝试:

Userlog.objects\
    .filter(pc_type='Desktop', user__type='Admin')\
    .order_by('-login_date')\
    .disctinct('user')

您可以通过userlog.user

访问用户

请粘贴您的模型以获得准确的查询。