1

BookとPageの2つのモデルがあり、PagetoBookの間に1対多の関係があるとします。各Bookモデルに、それぞれのBookモデルの一連のページを作成する機能を持たせたいのですが、各ページの外部キーを、それが作成されたBookインスタンスに関連付ける方法がわかりません。

私は現在、可能なすべての本の中から正しい本を見つけるアソシエート機能を持っています。もっと良い方法があると確信していますが、それを見つけることができないようです。外部キーを自分自身に設定することは可能ですか?

4

3 に答える 3

4
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インスタンスで関連するマネージャーを取得します。

于 2012-09-18T22:30:15.500 に答える
2

次のようなことを試みます:

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()

またはそのようなもの...クラスの順序も重要だと思います。

于 2012-09-18T22:15:30.990 に答える
1

BookとPageの間には1対多の関係があります。これは、1冊の本に複数のページがあり、各ページに1冊の本しかないことを意味します。

データベース(したがってORMマッパー)では、Pageで外部キーを作成することでこれをモデル化します。この外部キーは、これらのページを含むBookインスタンスを指します。

書籍のページを検索する場合は、書籍の主キーと同じ外部キーを持つすべてのページのページテーブルをクエリします。

于 2012-09-18T22:16:35.467 に答える