sql >> データベース >  >> RDS >> Mysql

1対多の関係でのDjangoクエリ

    これは、クエリセットアノテーションを使用して実現できる、または実現しようとするべきものではありません。これは、アノテーションがCountなどの集計関数にのみ使用できるためです。 、Sum など

    私があなたの質問を正しく理解した場合、クエリセットを反復処理するときにこの情報を取得できます:

    for order in Order.objects.all():
        types = order.details.values_list('product_type', flat=True)
    

    関連するOrderDetailをプリフェッチすることで、これをより効率的にすることができます 各注文の行:

    for order in Order.objects.prefetch_related('details'):
        types = order.details.values_list('product_type', flat=True)
    

    または、次の方法を使用して、各注文からいくつかの値を取得できます。

    queryset = Order.objects.values('id', 'user_id', 'details__product_type')
    

    単一のdbクエリを実行する必要があります。ただし、これがどのように機能するかについては、次の注を参照してください。 https:/ /docs.djangoproject.com/en/1.9/ref/models/querysets/#values

    クエリセットは、モデルインスタンスの代わりにdictを出力します。また、product_typeの適切なリストは取得できません。 s ...代わりに、次のような行が繰り返されます:

    [
        {'id': 1, 'user_id': 1, 'product_type': 'chair'},
        {'id': 1, 'user_id': 1, 'product_type': 'table'},
        {'id': 2, 'user_id': 3, 'product_type': 'chair'},
        ...
    ]
    

    ...したがって、Pythonでこれらの行を必要なデータ構造にグループ化する必要があります:

    from collections import OrderedDict
    
    grouped = OrderedDict()
    for order in Order.objects.values('id', 'user_id', 'details__product_type'):
        if order['id'] not in grouped:
            grouped[order['id']] = {
                'id': order['id'],
                'user_id': order['user_id'],
                'types': set(),
            }
        grouped[order['id']]['types'].add(order['details__product_type'])
    


    1. MariaDBでのGREATEST()のしくみ

    2. ForeachまたはFor–それが問題です

    3. データベースの値を使用してPHPの2列テーブルを作成するにはどうすればよいですか?

    4. ポリゴンのポイントがLatLongの場合、MySQLデータベースのポリゴンの面積を計算するにはどうすればよいですか?