Django:通过ID获取最后一条记录[多对一关系]

标签 django database django-models orm python-3.7

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

enter image description here

这是 NameHistory 表的示例数据:

enter image description here

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

sample3
test2
data1

最佳答案

您需要 window function :

Window functions provide a way to apply functions on partitions. Unlike a normal aggregation function which computes a final result for each set defined by the group by, window functions operate on frames and partitions, and compute the result for each row.

对于您的架构设计:

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

这应该返回预期的列表。

关于Django:通过ID获取最后一条记录[多对一关系],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58909044/

相关文章:

python-3.x - Django Rest 框架如何创建家庭并为该家庭分配成员,同时为每个成员分配角色

python - 如何编辑allauth的urls.py?

python:如何从类变量访问class.__dict__?

database - bulk_create 后 Django 1.4 主键冲突

mysql - 使用 Access 或 MySQL 作为后端数据库

python - 使模型引用一对多抽象模型

python - 在 Django Admin 中将 ManyToManyWidget 添加到 ManyToManyField 的反面

python - 使用 Django Rest Framework 的双嵌套序列化器

Django 相当于 SQL REPLACE

mysql - mysql数据库中的这个查询有什么问题?