【问题标题】:Django model get unique foreign key rows based on other column max valueDjango模型根据其他列最大值获取唯一的外键行
【发布时间】:2017-04-06 10:35:26
【问题描述】:

我是 Django 新手,我正在尝试创建一个简单的应用程序来跟踪 SQlite 数据库中的不同服务器配置。我创建了 2 个数据库模型:

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 表,只获取每个服务器 id 的“config_version”字段最大值的行,例如:

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 表:

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

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

我可以使用原始 SQL 查询来执行此操作,但我更愿意以“Django”方式执行此操作。任何帮助将不胜感激。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    经过一番努力,我找到了一个适合我的解决方案。我确信它不是最佳的,但至少似乎有效:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2021-06-18
      • 2021-11-25
      • 2019-05-29
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      相关资源
      最近更新 更多