Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Permintaan Django dalam hubungan Satu ke Banyak

Ini bukan sesuatu yang dapat atau harus Anda coba capai dengan anotasi queryset. Ini karena anotasi hanya dapat digunakan untuk fungsi agregasi seperti Count , Sum dll.

Jika saya memahami pertanyaan Anda dengan benar, Anda bisa mendapatkan info ini saat mengulangi set kueri:

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

Anda dapat membuatnya lebih efisien dengan mengambil OrderDetail terkait sebelumnya baris untuk setiap pesanan:

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

Atau, Anda dapat mengambil beberapa nilai dari setiap pesanan menggunakan metode ini:

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

Itu harus melakukan permintaan db tunggal. Namun, lihat catatan di sini tentang cara kerjanya:https:// /docs.djangoproject.com/en/1.9/ref/models/querysets/#values

Queryset Anda akan menampilkan dict alih-alih instance model. Dan Anda tidak akan mendapatkan daftar product_type nice yang bagus s... sebagai gantinya Anda akan mendapatkan baris berulang seperti:

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

...jadi Anda harus mengelompokkan baris-baris ini dengan python ke dalam struktur data yang Anda inginkan:

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. Cluster Nodejs dengan koneksi MySQL

  2. Gabung Tabel Ke array bersarang [PHP/MYSQL]

  3. MySql - Perbarui tabel menggunakan pernyataan pilihan dari tabel yang sama

  4. GALAT 1064 (42000):Anda memiliki kesalahan dalam sintaks SQL Anda; Ingin mengonfigurasi kata sandi sebagai root sebagai pengguna

  5. Bagaimana cara memodelkan struktur MySQL untuk menangani otentikasi? Dengan informasi pengguna terpisah