2017-04-06 48 views
0

我是Django的新手,我试图创建一个简单的应用程序,用于跟踪SQlite数据库中不同的服务器配置。我创建了2个数据库模型:Django模型获取基于其他列最大值的唯一外键行

from django.db import models 

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

class Config(models.Model): 
    server = models.ForeignKey(Server, on_delete=models.CASCADE) 
    configuration = models.CharField(max_length=250) 
    config_version = models.IntegerField() 

这里有2个型号的样本数据:

Server: 
| id  | name | 
| ------ | ------ | 
| 1  | Server1 | 
| 2  | Server2 | 
| 3  | Server3 | 

Config: 
| id  | configuration | config_version | server | 
| ------ | ------------- | -------------- | ------ | 
| 1  | srv1_cfg1  | 1    | 1  | 
| 2  | srv2_cfg1  | 1    | 2  | 
| 3  | srv2_cfg2  | 2    | 2  | 
| 4  | srv2_cfg3  | 3    | 2  | 
| 5  | srv3_cfg1  | 1    | 3  | 
| 6  | srv1_cfg2  | 2    | 1  | 
| 7  | srv1_cfg3  | 3    | 1  | 

我想与“config_version的最大值来查询配置表,并获得唯一的行“现场的每个服务器ID,如:

Desired result: 
| id  | configuration | config_version | serverid | servername | 
| ------ | ------------- | -------------- | -------- | ---------- | 
| 4  | srv2_cfg3  | 3    | 2  | Server2 | 
| 5  | srv3_cfg1  | 1    | 3  | Server3 | 
| 7  | srv1_cfg3  | 3    | 1  | Server1 | 

我已经尝试了许多不同的选择,构建正确的查询,但到目前为止,我无法得到我想要的东西。我的最好成绩是查询服务器表:

Server.objects.annotate(maxver=Max('config__config_version')) 

但似乎我无法访问配置表对象,所以我想我需要查询的配置表,一些过滤?

我可以用一个原始的SQL查询来做到这一点,但我强烈倾向于这样做“Django”的方式。任何帮助都感激不尽。

回答

0

经过一番更多的努力之后,我找到了适合我的解决方案。我敢肯定,这是不是最佳的,但至少看起来作品:

from django.db.models import Max, F 

s1 = Config.objects.annotate(maxver=Max('server__config__config_version')) 
config_list = s1.filter(config_version=F('maxver')) 

如果有更好的方式来做到这一点,我很想知道。