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

Django-forespørgsel i One to Many-forholdet

Dette er ikke noget, du kan eller bør forsøge at opnå med en forespørgselssætannotering. Dette skyldes, at annoteringer kun er brugbare til aggregeringsfunktioner som Count , Sum osv.

Hvis jeg har forstået dit spørgsmål rigtigt, kan du få disse oplysninger, når du itererer over forespørgselssættet:

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

Du kan gøre dette mere effektivt ved at forhåndshente den relaterede OrderDetail rækker for hver ordre:

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

Alternativt kan du hente nogle værdier fra hver ordre ved hjælp af denne metode:

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

Den skal lave en enkelt db-forespørgsel. Se dog bemærkningerne her om, hvordan dette virker:https:/ /docs.djangoproject.com/da/1.9/ref/models/querysets/#values

Dit forespørgselssæt udsender diktater i stedet for modelforekomster. Og du vil ikke få en god liste over product_type s... i stedet får du gentagne rækker som:

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

...så du bliver nødt til at gruppere disse rækker i python i den datastruktur, du ønsker:

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. ufuldstændig information fra forespørgsel på pg_views

  2. Dvale gemmer brugermodel til Postgres

  3. hvordan man binder dynamisk json til treeview wpf

  4. Find nummerposition i streng