Django Shortcut嵌套外键 [英] Django Shortcut nested foreign key

查看:35
本文介绍了Django Shortcut嵌套外键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我的models.py中有以下内容:

  class书籍:经过课堂部分:book = models.ForeignKey(书籍)课章:零件=模型.ForeignKey(零件)数字= models.IntegerField() 

我想做

  book = Book.objects.get(id = someID)章节= Book.chapters.get(number = 4) 

什么是干净的方法?我在这本书上想到了一位经理,但在这种情况下似乎不起作用.

我当然可以在课本上实现get_chapters方法,但我想避免这种情况.

有什么想法吗?

您也可以在模板中执行此操作.

但是,对于性能最高的解决方案,也请保存FK以便从章节中进行预订.通过覆盖save方法可以轻松完成此操作.

  class章节:part = models.ForeignKey(Part,related_name ="part_chapters")数字= models.IntegerField()book = models.ForeignKey(Book,related_name ="chapters",null = True,blank = True)#允许null/blank值;将在保存方法中填充def save(self,* args,** kwargs):self.book = self.part.book超级(第章,自我).save(* args,** kwargs)>>>book = Book.objects.first().prefetch_related("parts","chapters")>>>print(book.parts.all())#返回书籍的所有部分>>>打印(book.chapters.all()) 

Suppose I have the following in my models.py:

class Book:
    pass

class Part:
    book = models.ForeignKey(Book)

class Chapter:
    part = models.ForeignKey(Part)
    number = models.IntegerField()

I would like to do

book = Book.objects.get(id=someID)
chapters = Book.chapters.get(number=4)

What is a clean way to do so? I thought of a Manager on the book class but it doest not seem to work for this case.

Of course I could implement a method get_chapters on class book but i would like to avoid this.

any ideas ?

解决方案

Using related_name arguments for FK fields, coupled with prefetch_related for a queryset, will allow you to fetch all info related to a book with minimal performance hit (each prefetch_related param calls a separate query).

class Book:
    pass

class Part:
    book = models.ForeignKey(Book, related_name="parts")

class Chapter:
    part = models.ForeignKey(Part, related_name="chapters")
    number = models.IntegerField()

# fetch a book and all related info w/ only 2 db hits
book = Book.objects.first().prefetch_related("parts","parts__chapters")
print(book.parts.all()) # returns all parts for book
for part in book.parts.all():
    print part.chapters.all()

You can do this in a template as well.

However, for the most performant solution, save a FK to book from chapter as well. This can be easily done by overriding the save method.

class Chapter:
    part = models.ForeignKey(Part, related_name="part_chapters")
    number = models.IntegerField()
    book = models.ForeignKey(Book, related_name="chapters", null=True, blank=True) # allow null/blank values; will be populated in save method
    def save(self, *args, **kwargs):
        self.book = self.part.book
        super(Chapter, self).save(*args, **kwargs)

>>> book = Book.objects.first().prefetch_related("parts","chapters")
>>> print(book.parts.all()) # returns all parts for book
>>> print(book.chapters.all())

这篇关于Django Shortcut嵌套外键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆