2016-08-17 8 views
0

オブジェクト内のすべての決定子オブジェクトのカウントを取得:ジャンゴ - クエリセット - すべての親が、私はこのモデルを持っている

class Order(models.Model): 
    #bunch of fields# 

class Laptop(models.Model): 
    #bunch of fields# 

class Camera(models.Model): 
    #bunch of fields# 

class MusicPlayer(models.Model): 
    #bunch of fields# 

最後の三つは、Orderクラスに関連する外部キーを持っています。 私はQuerySetを介して、すべての注文の各子オブジェクトの合計カウントを、それぞれのグループごとにグループ化して取得する必要があります。

次のようになります結果: ノート:5 カメラ:10 MusicPlayer:1

私は別のDjangoのクエリを使用してみましたが、私が得るすべては、それぞれのカウントを取得しているために代わりにすべての注文の数を注文してください。

これは、それぞれ別々にクエリを実行するだけで簡単に行うことができますが、1つのクエリですべてを実行するように要求されたことは分かります。

答えて

1

あなたのモデルにrelated_nameを追加します。

class Laptop(models.Model): 
    order = models.ForeignKey(Order, related_name='laptops') 

class Camera(models.Model): 
    order = models.ForeignKey(Order, related_name='cameras') 

class MusicPlayer(models.Model): 
    order = models.ForeignKey(Order, related_name='music_players') 

そしてあなたはannotateCountを使用して、関連するモデルの数を取得することができた:あなたのコメントについて

from django.db.models import Count 

orders = Order.objects.annotate(laptops_count=Count('laptops'), cameras_count=Count('cameras'), music_players_count=Count('music_players')) 
print(orders.laptops_count) 
print(orders.cameras_count) 
print(orders.music_players_count) 
+0

ありがとう!オーダーオブジェクトからラップトップに直接アクセスしようとしているので、AttributeErrorを返します。これは私が持っていたのと同じ問題です。カウントにアクセスするために、すべてのオブジェクトに1つずつアクセスする(例えばorders [0])ことは望ましくありません。 – Guido

+0

ちなみに、annotateの値に "related_name"と同じ名前を付けると、エラーが返されます – Guido

+0

あなたは正しい答えです。 1つのクエリのみを使用し、print(orders.query)を使用してクエリを印刷し、SQLをチェックすることができます –

関連する問題