「A には B への外部キーがあります。B には A への OneToOneField があります。」これがあなたの関係を設定する方法ではないと思います。B を A の ForeignKey として設定するだけで、B.a_set.all() を使用して B から A にアクセスできます。
hereを言い換えると、次のモデル定義では、Book は Publisher と 1 対多 (ForeignKey)、Author とは多対多です。( ~~~~ は、モデル間の関係に関係のない他のものを意味します)
class Publisher(~~~~):
~~~~
class Author(~~~~):
~~~~
class Book(~~~~):
publisher = models.ForeignKey(Publisher)
authors = models.ManyToManyField(Author)
次に、次のように、特定の本から出版社と著者にアクセスできます。
b = Book.objects.get(id=50)
publisher1 = b.publisher # publisher object for a given book
author_set = b.authors.all() # query set of authors for a given book
逆の関係を行うことができます (上記のモデルでは明示的に定義されていません)。
p = Publisher.objects.get(name='Apress Publishing')
p.book_set.all() # query set of books for a given publisher
publisher1.book_set.all() # set of books for the publisher from above.
a = Author.objects.get(name="JK Rowling")
a.book_set.all() # query set of books for a given author
オブジェクト フィールドを更新するときはいつでも、呼び出しsave()
てデータベースに保存する必要がありますが、そうする前に ForeignKey やその他のフィールドを再割り当てする必要はありません。それがうまくいかなかった場合は、モデル間のファンキーな関係が原因だったのかもしれません。100% 確実ではありませんが、オブジェクトが (新しい) 主キーを取得するのは、それがデータベースに初めて保存されたときだけであり、それが最初の pk であると思います。