Saya ingin tahu apakah ada cara untuk melakukan kueri di Django yang bukan " SELECT * FROM...
" di bawahnya. Saya mencoba melakukan " SELECT DISTINCT columnName FROM ...
" sebagai gantinya.
Secara khusus saya memiliki model yang terlihat seperti:
class ProductOrder(models.Model):
Product = models.CharField(max_length=20, promary_key=True)
Category = models.CharField(max_length=30)
Rank = models.IntegerField()
dimana Rank
adalah peringkat dalam a Category
. Saya ingin dapat mengulang semua Kategori dengan melakukan beberapa operasi pada setiap peringkat dalam kategori itu.
Pertama-tama saya ingin mendapatkan daftar semua kategori dalam sistem dan kemudian membuat kueri untuk semua produk dalam kategori itu dan mengulanginya hingga setiap kategori diproses.
Saya lebih suka menghindari SQL mentah, tetapi jika saya harus pergi ke sana, itu akan baik-baik saja. Meskipun saya belum pernah mengkodekan SQL mentah di Django / Python sebelumnya.
Sebenarnya cukup sederhana jika Anda menggunakan PostgreSQL , cukup gunakan
distinct(columns)
( dokumentasi ).Productorder.objects.all().distinct('category')
Perhatikan bahwa fitur ini telah dimasukkan dalam Django sejak 1.4
sumber
can_distinct_on_fields
yang tampaknya hanya untuk Postgresall()
tidak perlu di siniJawaban lainnya baik-baik saja, tetapi ini sedikit lebih bersih, karena hanya memberikan nilai seperti yang akan Anda peroleh dari kueri DISTINCT, tanpa penyimpangan dari Django.
>>> set(ProductOrder.objects.values_list('category', flat=True)) {u'category1', u'category2', u'category3', u'category4'}
atau
>>> list(set(ProductOrder.objects.values_list('category', flat=True))) [u'category1', u'category2', u'category3', u'category4']
Dan, ini berfungsi tanpa PostgreSQL.
Ini kurang efisien daripada menggunakan .distinct (), dengan anggapan bahwa DISTINCT dalam database Anda lebih cepat daripada python
set
, tetapi bagus untuk noodling di sekitar shell.sumber
values_list
tidak dimasukkan keDISTINCT
dalam kueri sql, jadi ini akan membawa banyak nilai jika ada.Pengguna memesan dengan bidang itu, dan kemudian lakukan berbeda.
ProductOrder.objects.order_by('category').values_list('category', flat=True).distinct()
sumber