django - .objects.get()何时评估?

Ots*_*lal 2 python django

假设我有:

class Library(models.Model):
    name = models.CharField(max_length = 100)

class Books(models.Model):
    library = models.ForeignKey(Library)
    book = models.CharField(max_length = 100)
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的Books,我们知道我们可以Books只用Libraryid 来填充库,但我们也可以使用实例Library.我的问题是,如果我们只提供身份证件会更好吗?如果我想使用该实例,那么我必须评估使用.get(),然后它是否命中数据库?

附加问题:从文档中,queryset是懒惰的,它在评估之前不会访问数据库,所以queryset何时进行评估?

spe*_*son 7

是的,.get()立即进行评估.当然,使用ID将避免数据库查询.

get不是懒惰,因为它不返回QuerySet - 它返回模型的单个实例.QuerySets来自类似的东西.filter(),因此例如Library.objects.filter(id=5)Library.objects.get(id=5)立即评估时进行延迟评估.

文档中介绍了QuerySet的实际评估- 基本上,只要您实际从QuerySet中提取值,就会对其进行评估.完整的清单是这样的:

  • 迭代
  • 切片
  • 酸洗
  • repr()
  • len()
  • list()
  • bool()