【问题标题】:Django ORM get each group's latest dataDjango ORM 获取每个组的最新数据
【发布时间】:2020-01-15 17:29:32
【问题描述】:

我想获取特定用户的所有条款,最新的协议数据。 三是具有术语名称的术语表。 在表 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)

terms 是外键

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

【问题讨论】:

    标签: mysql django django-models group-by


    【解决方案1】:

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

    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()
    

    如果您需要它非常快,您可以考虑在您的数据库中放置一个触发器,以存储每个 Terms 的最新 TermsAgreeHistoryhttps://dba.stackexchange.com/a/243988/186435

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 2013-11-24
      • 2018-06-14
      • 2013-07-27
      • 2017-09-27
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      相关资源
      最近更新 更多