假设我有两个模型,Book 和 Page,这样 Page 到 Book 之间存在一对多的关系。我希望每个 Book 模型都有一个为各自的 Book 模型创建一堆 Pages 的函数,但我不确定如何将每个 Page 的外键关联回它创建的 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 之间存在一对多的关系。这意味着一本书有几页,每页只有一本书。
在数据库中(因此在 ORM 映射器中),您可以通过在 Page 中创建外键来对此进行建模。此外键将指向包含这些页面的 Book 实例。
如果要查找 Book 的 Pages,您将查询 Pages 表以查找具有与 Book 的主键相同的外键的所有 Pages。