我正在尝试使用 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
表的示例数据:
我在这里想要的是过滤或获取每个collection_data_id
中NameHistory
中的最后一条记录(红色矩形内的记录)并将其显示在我的 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/