【问题标题】:Django: Get last record by ID [many-to-one relationship]Django:按ID获取最后一条记录[多对一关系]
【发布时间】:2019-11-18 06:29:33
【问题描述】:

我正在尝试使用 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 表创建了一个示例数据:

这是NameHistory 表的示例数据:

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

sample3
test2
data1

【问题讨论】:

    标签: django database django-models orm python-3.7


    【解决方案1】:

    你需要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()
     )
    

    这应该返回预期的列表。

    【讨论】:

    • expression=FirstValue('old_name') 在这部分,old_name 来自NameHistory。 .
    • 我认为到目前为止您的答案是最接近的。我仍在配置它,但我认为它可以解决我的问题。 .
    • 您好,先生!如何将这些数据显示到我的模板中?我正在使用 jinja 模板。 .
    【解决方案2】:

    试试这个-

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

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

    【讨论】:

    • 我试过这个,但它返回给我一个查询集。我怎样才能只得到old_name的数据? .
    • @N.Omugs 试试这个,NameHistory.objects.values('old_name').annotate(Max('id')).values_list('old_name', flat=True)。这将返回old_name 的列表您还可以使用 for 循环遍历查询集以在 NameHistory.objects.values('old_name').annotate(Max(' id'))]
    猜你喜欢
    • 2018-06-26
    • 2021-05-31
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2020-10-01
    相关资源
    最近更新 更多