web-dev-qa-db-ja.com

テーブルフィールドから個別の値を選択する

私はDjangoのORMに頭を悩ましています。私がしたいのは、テーブルのフィールド内の個別の値のリストを取得することです。次のいずれかに相当します。

SELECT DISTINCT myfieldname FROM mytable

(または代わりに)

SELECT myfieldname FROM mytable GROUP BY myfieldname

少なくとも、生のsqlに頼る前にDjangoの方法でそれをしたいと思います。例えば、テーブルで:

id、street、city

1、メインストリート、ハル

2、その他のストリート、ハル

3、Bibble Way、レスター

4、別の方法、レスター

5、Londidium、High Street

取得したい:

ハル、レスター、ロンディジウム。

84
alj

あなたのモデルは「ショップ」だとしましょう

_class Shop(models.Model):
    street = models.CharField(max_length=150)
    city = models.CharField(max_length=150)

    # some of your models may have explicit ordering
    class Meta:
        ordering = ('city')
_

Meta class ordering属性が設定されている場合があるため、order_by()を使用する場合、パラメーターなしでdistinct()を使用して順序をクリアできます。 _order_by_() の下のドキュメントを参照してください

デフォルトの順序でなくても、クエリに順序を適用したくない場合は、パラメーターなしでorder_by()を呼び出します。

distinct() 順序付けでdistinct()を使用する際の問題を説明しているノートで。

DBをクエリするには、次を呼び出すだけです。

_models.Shop.objects.order_by().values('city').distinct()
_

辞書を返します

または

_models.Shop.objects.order_by().values_list('city').distinct()
_

これは、ValuesListQuerySetにキャストできるlistを返します。 _flat=True_を_values_list_に追加して、結果をフラット化することもできます。

参照: フィールドによるクエリセットの個別の値の取得

174
jujule

まだ非常に関連性の高い jujuleの回答 に加えて、order_by()distinct("field_name")クエリに与える影響を認識することも非常に重要です。 ただし、これはPostgresのみの機能です!

Postgresを使用しており、クエリを区別するフィールド名を定義する場合、order_by()は同じシーケンスで同じフィールド名(またはフィールド名)で始まる必要がありますその後のフィールド)。

注意

フィールド名を指定するときは、QuerySetでorder_by()を指定する必要があり、order_by()のフィールドは、distinct()のフィールドで同じ順序で開始する必要があります。

たとえば、SELECT DISTINCT ON(a)は、列aの各値の最初の行を提供します。順序を指定しない場合、任意の行が表示されます。

でお店を知っている都市のリストをe-g-抽出したい場合、jujuleの例はこれに適応する必要があります:

# returns an iterable Queryset of cities.
models.Shop.objects.order_by('city').values_list('city', flat=True).distinct('city')  
5
ingofreyer

例:

# select distinct code from Platform where id in ( select platform__id from Build where product=p)
pl_ids = Build.objects.values('platform__id').filter(product=p)
platforms = Platform.objects.values_list('code', flat=True).filter(id__in=pl_ids).distinct('code')
platforms = list(platforms) if platforms else []
2
Roger Sodré