使用Django';s pre_fetch_相关函数

使用Django';s pre_fetch_相关函数,django,django-queryset,Django,Django Queryset,鉴于以下情况: 在图书馆里,一本书只能放在一个书套里。在整个过程中,这本书可以从一个袖子移到另一个袖子 模型呢 class Sleeve(models.Model): sleeve_name = models.CharField(max_length=60) sleeve_number = models.DecimalField() class Book(models.Model): book_title = models.CharField(max_length=120) s

鉴于以下情况:

在图书馆里,一本书只能放在一个书套里。在整个过程中,这本书可以从一个袖子移到另一个袖子

模型呢

class Sleeve(models.Model):
  sleeve_name = models.CharField(max_length=60)
  sleeve_number = models.DecimalField()

class Book(models.Model):
  book_title = models.CharField(max_length=120)
  sits_in_sleeve = models.ForeignKey(Sleeve, null=False)
现在我想创建一个Django查询集来查询数字在1到10之间的所有袖子,并查询属于该袖子的所有书籍标题。如何使用
预取相关的

换句话说,我可以做如下事情:

sleeves = Sleeve.objects.filter(sleeve_number__lte=10,sleeve_number__gte=1)
for s in sleeves:
  b = Book.objects.get(sits_in_sleeve=s)
  s.book = b

但是有没有更优雅的方法呢?

你可以这样做:

b = Book.objects.filter(sits_in_sleeve__sleeve_number__lte=10,sits_in_sleeve__sleeve_number__gte=1)
因为Book model有一个名为的字段位于\u sleeve中,该字段与sleeve model具有外键关系

因此,您可以通过添加双下划线(即(uuu)来获取相关套管模型字段,对套筒模型字段执行任何操作

更新:

正如Sayse所建议的,您也可以使用范围函数,而不是单独使用u_gte和u lte。 像这样:

b = Book.objects.filter(sits_in_sleeve__sleeve_number__range=(1,10))

您可以使用预回迁相关的

sleeves = Sleeve.objects.filter(sleeve_number__lte=10,sleeve_number__gte=1).prefetch_related('book_set')
然后,无需进行其他查询即可获取每个袖子的书籍:

for sleeve in sleeves:
    books = sleeve.book_set.all()

嘿我的问题是:参数
book\u set
是如何产生的?我已经看过这个实现,但不确定它是否可以应用于所有人,这就是为什么我要问的。谢谢:)将
\u set
附加到小写型号名称后是默认的
相关\u名称
。您可以在
ForeignKey
字段的字段定义中用
相关的\u name
参数覆盖该字段
sleeve.book_set
就是所谓的相关管理器,它为您提供了一个sleeve中所有书籍的模型管理器功能。您是否真的需要这些袖子,或者您只对这些书籍感兴趣?并在我能理解的范围内查询属于这些书籍的所有书籍标题,你需要从1号到10号之间的所有书。是吗?我很确定这是op真正需要的,但我在等待回应。。。您可能需要使用-
sits\u in\u sleeve\u sleeve\u number\u range=(1,10)
@Sayse是的,这是接近小于10、大于1条件的更好方法。