Mysql
 sql >> база данни >  >> RDS >> Mysql

Заявка на 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

Вашият набор от заявки ще изведе dicts вместо екземпляри на модела. И няма да получите приятен списък с 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Деактивирайте ONLY_FULL_GROUP_BY

  2. JPA TemporalType.Date дава грешна дата

  3. опитвайки се да актуализирате mysql база данни в php

  4. Свързване с Docker контейнер от хост

  5. изберете count(*) от таблицата на mysql в php