Django:按ID [多对一关系]获取最新记录

我正在尝试使用Django模型中的多对一关系将一个表中的最后一个记录连接到另一个表。这是我的Django模型:

class DataCollecttion(models.Model):
    default_name = models.CharField(max_length=100)

class NameHistory(models.Model):
    old_name = models.CharField(max_length=100)
    collection_data = models.ForeignKey(DataCollection,on_delete=models.CASCADE,null=True)

在这里,我为DataCollection表创建了示例数据:

Django:按ID [多对一关系]获取最新记录

这是NameHistory表的示例数据:

Django:按ID [多对一关系]获取最新记录

我这里想要过滤或获取每个NameHistorycollection_data_id中的最后一条记录(红色矩形内的记录)并将其显示在我的视图中。 简而言之,我想获得这些行以及如何在ORM查询中做到这一点:

sample3
test2
data1
sdfweg34234 回答:Django:按ID [多对一关系]获取最新记录

您是否需要window function

  

窗口函数提供了一种在分区上应用函数的方法。窗口函数不同于普通的聚合函数,它为group by定义的每个集合计算最终结果,而窗口函数则对帧和分区进行运算,并为每一行计算结果。

对于您的架构设计:

from django.db.models import F,Window
from django.db.models.functions.window import FirstValue

( DataCollecttion
  .objects
  .annotate(
     first_old_name=Window(
        expression=FirstValue('namehistory__old_name'),partition_by=[F('id'),],order_by=F('namehistory__id').desc()
     )
   )
  .values_list('first_old_name',flat=True)
  .distinct()
 )

这应该返回预期的列表。

,

试试这个-

from django.db.models import Max
NameHistory.objects.values('old_name').annotate(Max('id'))

它将返回NameHistory表的最大ID(最新)。

本文链接:https://www.f2er.com/3083189.html

大家都在问