8

假设我有:

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

class Books(models.Model):
    library = models.ForeignKey(Library)
    book = models.CharField(max_length = 100)

我想创建一个新的,我们知道我们可以只用idBooks填充库,但我们也可以使用. 我的问题是,如果我们只提供 id 会更好吗?如果我想使用实例,那么我必须评估 using ,那么它会命中数据库吗?BooksLibraryLibrary.get()

附加问题:从文档来看,查询集是惰性的,它在评估之前不会访问数据库,那么查询集何时评估?

4

1 回答 1

13

是的,.get()立即评估。当然,使用 ID 可以避免数据库查询。

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

QuerySet 的实际评估包含在文档中- 基本上,任何时候您实际从 QuerySet 中提取一个值,它都会被评估。完整列表如下:

  • 迭代
  • 切片
  • 酸洗
  • repr()
  • len()
  • list()
  • bool()
于 2012-11-16T23:39:10.610 回答