Saya ingin menggabungkan dua set kueri, atau lebih baik, hanya membuat satu menggunakan sintaks Case/When untuk kasus tertentu.

Saya telah melihat dalam dokumentasi yang dapat digunakan untuk pemfilteran queryset, tidak hanya anotasi, yang persis seperti yang saya butuhkan. Namun, saya ingin menggunakan Kasus/Kapan untuk bidang model itu sendiri, bukan nilai bidangnya.

Proyek ini adalah e-commerce, saya menggunakan Django-oscar jadi modelnya cukup besar untuk diposting di sini. Hal yang perlu diketahui adalah bahwa garis keranjang mengacu pada suatu produk, dan suatu produk dapat berupa induk, anak, atau mandiri.

Ini kode saya:

self.in_stock_lines = basket.lines.filter(product__product_class__track_stock=True, is_customized=False)

Masalahnya, jika garis keranjang berkaitan dengan produk yang menjadi anak, bidang yang harus saya filter adalah product__parent__product_class__track_stock, sedangkan jika berkaitan dengan produk mandiri (tidak memiliki induk), tetap product__product_class__track_stock sebagai di queryset awal saya.

Apakah ada cara untuk melakukan ini? Atau apakah saya tidak punya pilihan selain menggabungkan dua set kueri menggunakan itertools.chain() misalnya?

0
gamabounta 13 Desember 2017, 13:39

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan Q objek untuk itu.

from django.db.models import Q

basket.lines.filter(
  Q(product_parent__isnull=True, product__product_class__track_stock=True) | 
  Q(product__parent__product_class__track_stock=True), is_customized=False)
1
Satendra 13 Desember 2017, 10:52