0

Aオブジェクトとオブジェクトを保存したいBAは への外部キーを持っていBます。Bには OneToOneField がありAます。保存するたびに変数を再割り当てする必要を回避する方法はありますか? または、それを行うためのより良い方法がありますか?

# The models a and b were created earlier in code
# a.b = b  Was already set earlier in code
# b.a = a  Was already set earlier in code
with transaction.commit_on_success():
    a.save() # pk created for a
    b.a = a  # attach a.pk to b
    b.save() # pk created for b
    a.b = b  # attach b.pk to a
    a.save() # re-save a to database
4

1 に答える 1

1

「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 であると思います。

于 2013-01-05T17:04:59.143 に答える