使用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条件的更好方法。