首页 > 解决方案 > 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 方法。我应该如何编写代码?

标签: mysqldjangodjango-modelsgroup-by

解决方案


这有点丑陋和缓慢,但这是我找到的最好的方法。

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如果您需要它非常快,您可以考虑在您的数据库中放置一个触发器以存储每个触发器的最新信息Termshttps ://dba.stackexchange.com/a/243988/186435


推荐阅读