1. ホーム
  2. django

[解決済み] djangoでDISTINCT個々の列を選択しますか?

2022-02-11 21:05:57

質問

Django で " ではないクエリを実行する方法があるのかどうか、気になるところです。 SELECT * FROM... "の下にあります。私は、".をしようとしています。 SELECT DISTINCT columnName FROM ... の代わりに、" を使用します。

具体的には以下のようなモデルを持っています。

class ProductOrder(models.Model):
   Product  = models.CharField(max_length=20, promary_key=True)
   Category = models.CharField(max_length=30)
   Rank = models.IntegerField()

ここで Rank の中のランクです。 Category . すべてのカテゴリーを反復して、そのカテゴリー内の各ランクに対して何らかの操作を行えるようにしたいのです。

まず、システム内の全カテゴリーのリストを取得し、そのカテゴリー内の全商品を照会し、全カテゴリーが処理されるまで繰り返すようにしたい。

生のSQLは避けたいのですが、どうしてもというならそれでもいいでしょう。でも、Django/Pythonで生のSQLをコーディングしたことはないんですけどね。

どのように解決するのですか?

データベースから個別のカラム名のリストを取得する方法のひとつは distinct() と合わせて values() .

あなたの場合、以下のようにして、個別のカテゴリー名を取得することができます。

q = ProductOrder.objects.values('Category').distinct()
print q.query # See for yourself.

# The query would look something like
# SELECT DISTINCT "app_productorder"."category" FROM "app_productorder"

ここで覚えておくべきことがいくつかあります。まず、これは ValuesQuerySet とは動作が異なります。 QuerySet . の最初の要素にアクセスすると q (上) では 辞書 のインスタンスではありません。 ProductOrder .

第二に、それは 注意書き を使用することについて、ドキュメントに記載されています。 distinct() . 上記の例では動作しますが、すべての distinct()values() はしないかもしれません。

PS : を使用するのは良いアイデアです。 小文字の名前 をモデル内のフィールドに追加します。あなたの場合、これは以下のようにモデルを書き換えることを意味します。

class ProductOrder(models.Model):
    product  = models.CharField(max_length=20, primary_key=True)
    category = models.CharField(max_length=30)
    rank = models.IntegerField()