Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn Django trong mối quan hệ Một đến Nhiều

Đây không phải là điều bạn có thể hoặc nên cố gắng đạt được với chú thích bộ truy vấn. Điều này là do chú thích chỉ có thể sử dụng cho các hàm tổng hợp như Count , Sum vv

Nếu tôi hiểu đúng câu hỏi của bạn, bạn có thể nhận được thông tin này khi lặp lại bộ truy vấn:

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

Bạn có thể làm cho việc này hiệu quả hơn bằng cách tìm nạp trước OrderDetail có liên quan hàng cho mỗi đơn đặt hàng:

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

Ngoài ra, bạn có thể truy xuất một số giá trị từ mỗi đơn đặt hàng bằng phương pháp này:

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

Nó sẽ thực hiện một truy vấn db duy nhất. Tuy nhiên, hãy xem ghi chú tại đây về cách hoạt động của điều này: https:/ /docs.djangoproject.com/en/1.9/ref/models/querysets/#values ​​

Bộ truy vấn của bạn sẽ xuất ra các số thay vì các phiên bản mô hình. Và bạn sẽ không nhận được danh sách product_type đẹp s ... thay vào đó bạn sẽ nhận được các hàng lặp lại như:

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

... vì vậy, sau đó bạn sẽ phải nhóm các hàng này trong python thành cấu trúc dữ liệu bạn muốn:

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. Tại sao tôi không thể sử dụng một biến làm tên bảng trong một thủ tục được lưu trữ?

  2. PHP Openssl giải mã một Mã hóa AES Mysql

  3. Không thể tải tệp hoặc lắp ráp 'Lỗi System.Data khi triển khai ứng dụng trên cơ sở dữ liệu sản xuất

  4. Sử dụng Cơ sở dữ liệu quan hệ MySQL trên Fedora 13

  5. Chọn một cơ sở dữ liệu trong mysql với khoảng trắng trong tên của nó