Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie Django w relacji jeden do wielu

To nie jest coś, co możesz lub powinieneś spróbować osiągnąć za pomocą adnotacji queryset. Dzieje się tak, ponieważ adnotacje są dostępne tylko dla funkcji agregacji, takich jak Count , Sum itp.

Jeśli dobrze zrozumiałem Twoje pytanie, możesz uzyskać te informacje podczas iteracji zestawu zapytań:

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

Możesz uczynić to bardziej wydajnym, pobierając z wyprzedzeniem powiązany OrderDetail wiersze dla każdego zamówienia:

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

Alternatywnie możesz pobrać niektóre wartości z każdego zamówienia za pomocą tej metody:

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

Powinien wykonać jedno zapytanie do bazy danych. Jednak zobacz uwagi tutaj, jak to działa:https:// /docs.djangoproject.com/en/1.9/ref/models/querysets/#values

Twój zestaw zapytań wygeneruje wpisy zamiast instancji modelu. I nie dostaniesz ładnej listy product_type s... zamiast tego otrzymasz powtarzające się wiersze, takie jak:

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

...więc będziesz musiał zgrupować te wiersze w Pythonie w żądanej strukturze danych:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dlaczego to zapytanie mysql nie działa?

  2. WYBIERZ tylko wiersze zawierające tylko znaki alfanumeryczne w MySQL

  3. PHP i MySQL opcjonalne warunki WHERE

  4. Histogram zapytań MySql dla danych przedziałów czasowych

  5. Odkrywanie serwera MySQL Binlog — Ripple