假设我有:
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何时进行评估?
答案 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()