gpt4 book ai didi

mysql - Django ORM获取各组最新数据

转载 作者:行者123 更新时间:2023-11-29 15:14:50 25 4
gpt4 key购买 nike

我想获取特定用户的所有条款、最新协议(protocol)数据。三是术语表,其中包含术语名称。表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 的最新协议(protocol)和条款签署日期。通过使用 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 -> 不能在列上使用不同的方法。我应该如何编写代码?

最佳答案

这有点丑陋且缓慢,但这是我发现的最好的方法。

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的最新TermsAgreeHistory:https://dba.stackexchange.com/a/243988/186435

关于mysql - Django ORM获取各组最新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59756710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com