sql >> Databáze >  >> RDS >> Mysql

Django dotaz ve vztahu One to Many

To není něco, čeho byste se mohli nebo měli snažit dosáhnout pomocí anotace sady dotazů. Je to proto, že anotace jsou použitelné pouze pro agregační funkce, jako je Count , Sum atd.

Pokud jsem správně pochopil vaši otázku, můžete tuto informaci získat při iteraci sady dotazů:

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

Můžete to zefektivnit předběžným načtením souvisejícího OrderDetail řádků pro každou objednávku:

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

Případně můžete načíst některé hodnoty z každé objednávky pomocí této metody:

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

Mělo by to udělat jeden db dotaz. Podívejte se však na poznámky o tom, jak to funguje:https:/ /docs.djangoproject.com/en/1.9/ref/models/querysets/#values

Vaše sada dotazů bude vydávat diktáty namísto instancí modelu. A nedostanete pěkný seznam product_type s... místo toho získáte opakované řádky jako:

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

...takže budete muset tyto řádky v pythonu seskupit do požadované datové struktury:

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. Funkce AVG() v PostgreSQL

  2. Přihlašovací skript se nespouští - Bluehost

  3. Jak provedu GROUP BY na aliasovém sloupci na serveru MS-SQL?

  4. Efektivní způsob, jak vypočítat počet cizích klíčů ve druhé tabulce a zobrazit jej s řádky z první tabulky - PHP - MySQL