質問

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 []
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top