微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Django:选择具有最大时间戳的值或连接到同一个表

我有一个简单的Django模型@H_502_1@

@H_502_1@

class Server(models.Model):
    name = models.CharField(max_length=120)

class ServerPropertie(models.Model):
    name = models.CharField(max_length=120)
    value = models.CharField(max_length=120)
    timestamp = models.DateTimeField()
    server = models.ForeignKey(Server)

我想将get_properties方法添加到Server模型,该模型将返回当前服务器的所有最后一个属性.我的意思是它应该返回当前服务器的所有属性名称名称和值,并且每个uniq属性名称应该具有值,该行具有最大时间戳.@H_502_1@

我可以在原始的硬编码原始sql(我使用postgres)中做到这一点:@H_502_1@

@H_502_1@

SELECT t1.name, t1.value FROM environments_serverpropertie t1
JOIN (SELECT max("timestamp") "timestamp", name 
      FROM environments_serverpropertie
      group by name) t2 on t1.name = t2.name and t1.timestamp = t2.timestamp;

或者在python中,但我相信存在pythonic解决方案.请你帮助我好吗.@H_502_1@

解决方法:@H_502_1@

如果你正在使用Postgresql,通常的语法是:@H_502_1@

@H_502_1@

select distinct on (name)
    name, value
from environments_serverpropertie
where server = ...
order by name, timestamp desc

PostgreSQL documentation开始:@H_502_1@

@H_502_1@

SELECT disTINCT ON ( expression [, …] ) keeps only the first row of
each set of rows where the given expressions evaluate to equal. The
disTINCT ON expressions are interpreted using the same rules as for
ORDER BY (see above). Note that the “first row” of each set is
unpredictable unless ORDER BY is used to ensure that the desired row
appears first.
@H_502_1@

您可以在@L_404_1@查看并试用它.@H_502_1@

django documentation开始,可以将此语法翻译为django:@H_502_1@

@H_502_1@

On Postgresql only, you can pass positional arguments (*fields) in
order to specify the names of fields to which the disTINCT should
apply. This translates to a SELECT disTINCT ON sql query.@H_502_1@

所以在django中它将是这样的:@H_502_1@

@H_502_1@

ServerPropertie.objects.filter(...).order_by('name', '-timestamp').distinct('name')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐