テーブルフィールドから個別の値を選択する
私は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
取得したい:
ハル、レスター、ロンディジウム。
あなたのモデルは「ショップ」だとしましょう
_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
_に追加して、結果をフラット化することもできます。
まだ非常に関連性の高い 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')
例:
# 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 []