Mysql
 sql >> Database >  >> RDS >> Mysql

Query Django nella relazione Uno a Molti

Questo non è qualcosa che puoi o dovresti provare a ottenere con un'annotazione del set di query. Questo perché le annotazioni sono utilizzabili solo per funzioni di aggregazione come Count , Sum ecc.

Se ho capito correttamente la tua domanda, puoi ottenere queste informazioni durante l'iterazione sul set di query:

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

Puoi renderlo più efficiente precaricando il relativo OrderDetail righe per ogni ordine:

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

In alternativa, puoi recuperare alcuni valori da ciascun ordine utilizzando questo metodo:

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

Dovrebbe fare una singola query db. Tuttavia, consulta le note qui su come funziona:https:/ /docs.djangoproject.com/en/1.9/ref/models/querysets/#values

Il tuo set di query produrrà dicts anziché istanze del modello. E non otterrai una bella lista di product_type s... invece otterrai righe ripetute come:

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

...quindi dovrai raggruppare queste righe in Python nella struttura dati che desideri:

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