2017-04-06 6 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テーブルクエリすることです:

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

これを行うには良い方法があれば、私はそれを知っているのが大好きです。

関連する問題