0

.extra()クエリが複数の結果を返す場所を使用しようとしています。たとえば、次のようになります。

'SELECT "books_books"."*" FROM "books_books" WHERE "books_books"."owner_id" = %s' % request.user.id

エラーが発生しました:only a single result allowed for a SELECT that is part of an expression

sqlite3を使用してdev-serverで試してください。誰かがこれを修正する方法を知っていますか?または私のクエリは間違っていますか?

編集:

私はdjango-simple-ratingsを使用しています、私のモデルは次のようになります:

class Thread(models.Model):
    #
    #
    ratings = Ratings()

Threadそれぞれの評価と、ユーザーがすでに評価しているかどうかを表示したいと思います。2つのアイテムの場合、6回ヒットします。1つは実際のアイテムで、Thread2つはにアクセスしratingsます。クエリ:

    threads = Thread.ratings.order_by_rating().filter(section = section)\
                .select_related('creator')\
                .prefetch_related('replies')

    threads = threads.extra(select = dict(myratings = "SELECT SUM('section_threadrating'.'score') AS 'agg' FROM 'section_threadrating' WHERE 'section_threadrating'.'content_object_id' = 'section_thread'.'id' ",)

Thread次に、dbをさらに押すことなく、それぞれの評価を印刷できます。2番目のクエリでは、次を追加します。

   #continue from extra 
   blahblah.extra(select = dict(myratings = '#####code above####',
                                voter_id = "SELECT 'section_threadrating'.'user_id' FROM 'section_threadrating' WHERE ('section_threadrating'.'content_object_id' = 'section_thread'.'id' AND 'section_threadrating'.'user_id' = '3') "))

をハードコーディングしましたuser_id。次に、このようなテンプレートで使用すると:

{% ifequal threads.voter_id user.id %}
#the rest of the code

エラーが発生しました:only a single result allowed for a SELECT that is part of an expression

はっきりしない場合はお知らせください。

4

1 に答える 1

1

問題はクエリにあります。通常、サブクエリを作成する場合、サブクエリは1つの結果のみを返す必要があります。したがって、次のようなサブクエリvoter_id

select ..., (select sectio_threadrating.user_id from ...) as voter_id from ....

複数の結果を返す可能性があるため、は無効です。常に1つの結果が返されることが確実な場合は、max()またはmin()集計関数を使用できます。

blahblah.extra(select = dict(myratings = '#####code above####',
                             voter_id = "SELECT max('section_threadrating'.'user_id') FROM 'section_threadrating' WHERE ('section_threadrating'.'content_object_id' = 'section_thread'.'id' AND 'section_threadrating'.'user_id' = '3') "))

これにより、サブクエリは常に1つの結果を返します。

そのハードコードを削除して、ここで取得する予定のuser_idは何ですか?たぶん、SQLだけを使用して1ユーザーに減らすことはできません。

于 2012-12-19T10:55:38.120 に答える