2016-10-19 7 views
1

PostgreSQLは.distint('field name')のデータベースクエリを持つことができますが、Sqliteはありません。したがって、ユーザーがsqlite3を使用している場合はより単純なクエリを実行するtry/exceptブロックを作成しました。ブロックを除いてNotImplementedErrorを実行していないブロック

raise NotImplementedError('DISTINCT ON fields is not supported by this database backend') 
NotImplementedError: DISTINCT ON fields is not supported by this database backend 

はあなたの操作を行います。ユーザーは、私は除いて、ブロック内の単純なクエリが実行され得ることを期待するSQLiteにも使用しているのであれば、しかし、例外がスローされ、簡単なクエリが実行されることは決してありません

try: 
    qs = qs.filter(tag__istartswith=self.q).order_by('tag').distinct('tag') 
except NotImplementedError: 
    qs = qs.filter(tag__istartswith=self.q) 

なぜこれが期待どおりに動いていないのか考えてみてください。

おかげ

答えて

3
querysets are lazyため

とクエリを作成中にエラーが発生しませんが、あなたが実際にそれを評価します。

あなたは例外キャッチしforcing your query to be evaluatedを試すことができます。

try: 
    qs = qs.filter(tag__istartswith=self.q).order_by('tag').distinct('tag') 
    dummy_boolean_var = qs.exists() 
except NotImplementedError: 
    qs = qs.filter(tag__istartswith=self.q) 

はEDIT:except句の割り当ては、元のクエリを変更しようとして、どうやら私のテストされていないバージョンが動作しませんでしたが。これは、OPによってテストされた作業バージョンです。

try: 
    qa = qs 
    qs = qs.filter(tag__istartswith=self.q).order_by('tag').distinct(‌​'tag') 
    dummy_boolean_var = qs.exists() 
except NotImplementedError: 
    qs = qa 
    qs = qs.filter(tag__istartswith=self.q) 
+1

ありがとうございます。私は小さな変更を加えなければならなかったが、それは機能する。最初の(試行)qsクエリが失敗すると、それによって、最初のqs試行が変更されたqsのように、2番目の(例外)qが失敗します。したがって、私はこのようなことをする必要があります: 'try:\ n qa = qs \ n qs = qs.filter(tag__istartswith = self.q).order_by( 'tag')。distinct( 'tag')\ n dummy_boolean_var = qs.exists()\ n (NotImplementedErrorを除く):\ n qs = qa \ n qs = qs.filter(tag__istartswith = self.q) '。申し訳ありませんが、それを改善する方法がわからない不正なフォーマットです。 –

+1

@TomBrockアップデートをありがとう、私は私の答えを編集し、将来の訪問者を助けるためにあなたの作業バージョンを含めた。 – Selcuk

関連する問題