テーブルフィールドから個別の値を選択する
-
20-09-2019 - |
質問
Django の ORM について理解するのに苦労しています。私がやりたいのは、テーブルのフィールド内の個別の値のリストを取得することです。次のいずれかに相当します。
SELECT DISTINCT myfieldname FROM mytable
(またはその代わりに)
SELECT myfieldname FROM mytable GROUP BY myfieldname
少なくとも、生の SQL に頼る前に、Django の方法で実行したいと考えています。たとえば、テーブルの場合は次のようになります。
ID、通り、都市
1、メインストリート、ハル
2、他の通り、ハル
3、ビブルウェイ、レスター
4、アナザー・ウェイ、レスター
5、ハイストリート、ロンディジウム
取得したいのは:
ハル、レスター、ロンディジウム。
解決
あなたのモデルは 'ショップ' であると言う。
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
クラスordering
属性が設定されている可能性があるため、、あなたはorder_by()
を使用するときに任意の順序をクリアするには、パラメータを指定せずdistinct()
を使用することができます。 order_by
()の
あなたが任意の順序がクエリに適用したくない場合は、いなくてもデフォルトの順序は、パラメーターを指定せずに)(をORDER_BY呼び出します。
と distinct()
にそれが問題について説明し、ノートで順序でdistinct()
を使用してます。
あなたのDBを照会するには、あなただけ呼び出す必要があります:
models.Shop.objects.order_by().values('city').distinct()
これは
dictionnaryを返します。または
models.Shop.objects.order_by().values_list('city').distinct()
この一つは、あなたがValuesListQuerySet
にキャストすることができlist
を返します。
また、結果を平らにするflat=True
するvalues_list
を追加することができます。
も参照してください:取得フィールドによって、クエリセットの個別の値の
他のヒント
まだ非常に関連性があることに加えて、 ジュジュールの答え, の影響についても認識することが非常に重要であると思います。 order_by()
の上 distinct("field_name")
クエリ。 ただし、これは Postgres のみの機能です。
Postgres を使用していて、クエリを区別する必要があるフィールド名を定義する場合、 order_by()
同じフィールド名 (複数のフィールド名) で同じ順序で開始する必要があります (後にさらにフィールドが存在する可能性があります)。
注記
フィールド名を指定するときは、QuerySetにorder_by()を提供する必要があり、order_by()のフィールドは、同じ順序で個別()のフィールドから開始する必要があります。
たとえば、(a)で除外を選択します。列aの各値の最初の行を示します。注文を指定しない場合は、任意の行が表示されます。
たとえば、お店を知っている都市のリストを抽出したい場合は、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 []