编辑
我从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表达式。
答案 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'
表示User
和UserLog
之间的关系:
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
。
请粘贴您的模型以获得准确的查询。