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

时间:2012-11-16 23:31:50

标签: 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)

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

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

1 个答案:

答案 0 :(得分:7)

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

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

docs中涵盖了QuerySet的实际评估 - 基本上,只要您实际从QuerySet中提取值,就会对其进行评估。完整的清单是这样的:

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