1

假设我有两个模型,Book 和 Page,这样 Page 到 Book 之间存在一对多的关系。我希望每个 Book 模型都有一个为各自的 Book 模型创建一堆 Pages 的函数,但我不确定如何将每个 Page 的外键关联回它创建的 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 之间存在一对多的关系。这意味着一本书有几页,每页只有一本书。

在数据库中(因此在 ORM 映射器中),您可以通过在 Page 中创建外键来对此进行建模。此外键将指向包含这些页面的 Book 实例。

如果要查找 Book 的 Pages,您将查询 Pages 表以查找具有与 Book 的主键相同的外键的所有 Pages。

于 2012-09-18T22:16:35.467 回答