mysql - Django ORM 获取每个组的最新数据
问题描述
我想获取特定用户的所有条款,最新的协议数据。三是具有术语名称的术语表。在表 TermsAgreeHistory 中,存在用户协议历史
class TermsAgreeHistory(model.Model):
user = models.CharField()
terms = models.ForeignKey(Terms)
date_signed = models.DateTimeField(auto_now_add=True)
is_agreed = models.BooleanField(default=True)
class Terms(models.Model):
name = models.CharField(unique=True)
术语是外键
TermsAgreeHistory
pk user terms data_signed is_agreed
----------------------------------------
1 Jack 1 20-01-01 Y
2 Jack 1 19-01-01 Y
3 Jack 2 20-01-01 N
4 Jack 2 19-01-01 N
5 Jack 3 20-01-01 Y
6 SAM 3 20-01-01 Y
表下有术语目录
Terms
pk name
--------------------
1 member_term
2 search_term
3 share_term
我想在条款表中搜索 Jack 的最新协议和条款签署日期。通过使用 Django ORM。
result
----------------------------------------
1 Jack member_term 20-01-01 Y
3 Jack search_term 20-01-01 N
5 Jack share_term 20-01-01 Y
最重要的是我的数据库是 mysql -> 不能在列上使用 distinct 方法。我应该如何编写代码?
解决方案
这有点丑陋和缓慢,但这是我找到的最好的方法。
from django.db.models import Prefetch, Subquery, OuterRef
terms_history = TermsAgreeHistory.objects\
.filter(terms_id=OuterRef("terms_id")\
.order_by("-id")\
.values("id")[:1]
newest = TermsAgreeHistory.objects.filter(id__in=Subquery(terms_history))
terms = Terms.objects\
.prefetch_related(
Prefetch("termsagreehistory_set", queryset=newest, to_attr="newest_history")
)\
.all()
TermsAgreeHistory
如果您需要它非常快,您可以考虑在您的数据库中放置一个触发器以存储每个触发器的最新信息Terms
:https ://dba.stackexchange.com/a/243988/186435
推荐阅读
- javascript - 将其更改为 jquery
- javascript - 满足条件时从数组中删除对象
- javascript - 通过访问父窗口在 iFrame 中创建 javascript 对象
- java - 为JAVA接口的默认方法实现普通接口的控制器
- android - 获取 UpdateEngine 在 AB OTA 应用程序中的空对象引用上
- html - 如何在一行上有两个内联 div,但响应式扩展并将所有其他内容向下推
- python - 在 Python 中语音转文本时遇到问题
- flutter - 如何在颤振中为 ios 和 android 检测模拟位置
- javascript - 编译 ejs 时在 partials\messages.ejs 中的参数列表后缺少 )
- visual-studio - 无法从主机访问在 docker 中运行的 api,但在使用 VS2019 调试时工作