BookとPageの2つのモデルがあり、PagetoBookの間に1対多の関係があるとします。各Bookモデルに、それぞれのBookモデルの一連のページを作成する機能を持たせたいのですが、各ページの外部キーを、それが作成されたBookインスタンスに関連付ける方法がわかりません。
私は現在、可能なすべての本の中から正しい本を見つけるアソシエート機能を持っています。もっと良い方法があると確信していますが、それを見つけることができないようです。外部キーを自分自身に設定することは可能ですか?
class Page(models.Model):
# default related_name would be `page_set` but `pages`
# seems a bit more intuitive, your choice.
book = models.ForeignKey("yourapp.Book", related_name="pages")
class Book(models.Model):
# ...
# you can use self as the instance and magically you have
# this `pages` attr which is a related manager, like `Page.objects`
# but limited to the particular Book's pages.
def special_page_create(self, *args, **kwargs):
self.pages.create(
# ...
)
# ...
次に、本のインスタンスがあり、関連するマネージャーがいます。
book = Book.objects.get(...
book.pages.create(...
page, created = book.pages.get_or_create(...
pages_gte_42 = book.pages.filter(num__gte=42)
# etc
他に知っておくべきことを教えてください。逆の関係は半魔法です。Bookクラスでは何も宣言しませんが、Book
インスタンスで関連するマネージャーを取得します。
次のようなことを試みます:
Class Page(models.Model):
#Your fields, like a name or whatever
name = models.CharField(max_length=60)
Book= models.ForeignKey("Book")
Class Book(models.Model):
#Your fields again
def create_page(self):
"Adds a page to the book"
#Do what you need to do
page = Page(name="TitlePage", Book=self)
page.save()
またはそのようなもの...クラスの順序も重要だと思います。
BookとPageの間には1対多の関係があります。これは、1冊の本に複数のページがあり、各ページに1冊の本しかないことを意味します。
データベース(したがってORMマッパー)では、Pageで外部キーを作成することでこれをモデル化します。この外部キーは、これらのページを含むBookインスタンスを指します。
書籍のページを検索する場合は、書籍の主キーと同じ外部キーを持つすべてのページのページテーブルをクエリします。