2016-11-04 1 views
0

djangoサブクエリに問題があります。元のQuerySetをフェッチするとき、私は使用する必要があるデータベースを指定します。私の勘違いは、後のサブクエリが、親クエリが使用したものではなく、「デフォルト」のデータベースを使用して終了することです。約そうに見えるdjangoサブクエリで使用されるデータベースはスティッキーですか?

私のモデルは、(私はいくつか持っている): -

class Author(models.Model): 
    author_name=models.CharField(max_length=255) 
    author_address=models.CharField(max_length=255) 

class Book(models.Model): 
    book_name=models.CharField(max_length=255) 
    author=models.ForeignKey(Author, null = True) 

は、今私はそうのようなマークと呼ばれているすべての書籍を表すクエリセットを取得: - 以降のどこかに続いて

b_det = Book.objects.using('some_db').filter(book_name = 'Mark') 

コードで私は次のようなことをしてサブクエリを起動します: -

if b_det: 
    auth_address = b_det[0].author.author_address 

私の問題は私のライブサーバで、その作者のIDの有効なデータがあってもサブクエリが失敗することがあります。私の疑惑は、サブクエリが同じデータベース 'some_db'を使用していないことです。これは可能ですか?使用する必要のあるデータベースがサブクエリでスティッキーにならないようにしますか?これは問題であるかもしれませんが、セロリ労働者の状況で起きているのですが、セロリとジャンゴORMの組み合わせにはバグがありますか?

このような状況が発生するたびに、select_relatedのようにフルフェッチを実行して解決しました。

b_det = Book.objects.using('some_db').select_related('author').filter(book_name = 'Mark') 

だから今、私は問題を解決するための唯一の方法は、事前にすべての私が必要とするデータを決定し、トップレベルの をselect_related使用して、すべてのそれらの内部モデルの参照を持っているフェッチていることを確認しています。このような何かが失敗する理由は何ですか?

これをローカルで再作成することはできません。それ以外の場合は、デバッグしていました。私が言ったように、それはかなりランダムです。

答えて

0

[OK]を、私はこれで今ハンドルを持っています。サブクエリが元のデータベースに固執するという私の前提は間違っています。 djangoはまず、設定されているデータベースルータにヒットします。その場合にのみ何も返されない場合は、元のデータベースを使用します。

したがって、設定されたデータベースルータが使用するデータベースを返すと、そのデータベースが使用されます。私の意見では、これは間違っているので、最初に元のデータベースを使用してから、データベースルーターをチェックする必要があります。

関連する問題