2017-12-29 10 views
1

からオブジェクトを作成します。Djangoの大部分は、クエリセット

data = ModelA.objects.values('date').annotate(total=Sum('amount'), average=Avg('amount')) 
# <QuerySet [{'date': datetime.datetime(2016, 7, 15, 0, 0, tzinfo=<UTC>), 'total': 19982.0, 'average': 333.03333333333336}, {'date': datetime.datetime(2016, 7, 15, 0, 30, tzinfo=<UTC>), 'total': 18389.0, 'average': 306.48333333333335}]> 

QuerySet内の各ハッシュからModelBオブジェクトを作成するためにdataを使用することが可能ですか?

私はQuerySetを反復処理し、解凍でき実現しそうのようにそれを実行します。

for q in data: 
     ModelB.objects.create(date=q['date'], total=q['total'], average=q['average']) 

しかし、よりエレガントな方法は何ですか?ほとんどの場合、bulk_create形式になっています。

答えて

3

これは、bulk_createを使用するため、オブジェクト1つではなく、1つのSQL一括作成操作を呼び出すため、呼び出しより効率的です。それははるかに洗練されても、:これはどのように機能するかについては

ModelB.objects.bulk_create([ ModelB(**q) for q in data ]) 

、二重のアスタリスクは、Pythonの関数にキーワード引数に辞書(または辞書のようなオブジェクト)を解凍します。

+1

私はこれがより効率的だと思います。forループの 'create'は各要素の保存をトリガーしますが、bulk_createのためには1つのSQLだけが存在します。 –

+0

@MenglongLiもちろん、もちろん – ubadub

関連する問題