2016-10-04 9 views
0

私のDjangoプロジェクトには2つのデータベースがあります。 2つの外部キーを持つモデルを作成しようとする場合を除いて、すべてが完全に機能します。両方の外部キーが同じデータベースから来ていても、問題のオブジェクトをまだ保存していない場合でも、データベースルーターはロックされ、私にCannot assign "<FKObject: fk_object2>": the current database router prevents this relation.を与えます。エラーを引き起こす複数のデータベースを持つDjangoプロジェクトに複数の外部キーを持つオブジェクトを作成

1 fk_object1 = FKObject.objects.using("database2").get(pk=1) 
2 fk_object2 = FKObject.objects.using("database2").get(pk=2) 
3 
4 object = Object() 
5 object.fk_object1 = fk_object1 
6 object.fk_object2 2 = fk_object2 
7 object.save(using="database2") 

問題以下のコードは、私はDjangoが何らかの形で呼び出すことを仮定しているように、オブジェクトもデータベースに保存される前に、6行目で発生しObject()それはまだ指定されていないにもかかわらず、database1と。

誰もこれに対処する方法を知っていますか?

+0

カスタムデータベースルータを定義しましたか? – 2ps

+0

あなたが定義したカスタムデータベースルータは、データ変更の制限があると思います –

+0

私は持っています。私はそこで行動を変えようとしましたが、私は運が全くありませんでした。 両方のfk_objectsを設定すると、 'db_for_write'が呼び出されますが、データを渡す方法がないようです。ヒントとして渡されたインスタンスでも、実際のインスタンス(この場合は 'fk_bject1'または' fk_object2')の代わりに 'str'型が使用されます。 – Lorenzo

答えて

1

だから私は、次のような周りの仕事を見つけてしまった:

結局のところ、私の疑惑は、部分的にしか本当でした。 Model()を呼び出すと、Djangoはデフォルトのデータベースを使用すると仮定しますが、外部キーを設定することはありません。これは、私のコードが、この時点で私のコードが6行目で、5行目ではエラーにならない理由を説明します.Djangoはデフォルトデータベースを使用していて、fk_object2database2から呼び出されているので、データベース間の関係。

は私がように threading.current_thread()を使用し、この問題を回避するには、次の

class Command(BaseCommand): 
    current_thread().db_name = "database2" 

    def handle(self, **args, **kwargs): 
     # Do work here 


class DatabaseRouter(object): 
    db_thread = threading.current_thread() 

    def db_for_read(self, model, **hints): 
     try: 
      print("Using {}".format(db_thread.db_name)) 
      return db_thread.db_name 
     except AttributeError: 
      return "default" 

    def db_for_write(self, model, **hints): 
     try: 
      print("Using {}".format(db_thread.db_name)) 
      return db_thread.db_name 
     except AttributeError: 
      return "default" 

この方法で、私の第二のデータベースは、それによって、すべての可能な関係の不整合を回避するたびに使用されています。

関連する問題