Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django-何时计算.objects.get()?_Python_Django - Fatal编程技术网

Python django-何时计算.objects.get()?

Python django-何时计算.objects.get()?,python,django,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) 我想创建一个新的图书,我们知道我们可以用库的id来填充图书上的库,但是我们也可以使用库的实例。我的问题是,

假设我有:

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

class Books(models.Model):
    library = models.ForeignKey(Library)
    book = models.CharField(max_length = 100)
我想创建一个新的
图书
,我们知道我们可以用
的id来填充
图书
上的库,但是我们也可以使用
的实例。我的问题是,如果我们只提供身份证是否更好?如果我想使用该实例,那么我必须使用
.get()
进行计算,然后它会影响数据库吗

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

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

get
并不懒惰,因为它不返回QuerySet-它返回模型的单个实例。查询集来自
.filter()
,因此,例如
Library.objects.filter(id=5)
是延迟计算的,而
Library.objects.get(id=5)
是立即计算的

QuerySet的实际计算包含在-基本上,任何时候您实际从QuerySet中提取一个值,它都会得到计算。完整列表如下:

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

请注意,切片一个未计算的查询集通常会返回另一个未计算的查询集。我相信get也是惰性计算的。在访问变量@ppetrid之前,您不会访问数据库,该变量涉及相关变量的查找。如果您安装了django debug toolbar,那么通过在
debugsqlshell
中调用它来验证
get
是否立即进行了计算是非常容易的-您将看到立即生成并执行的查询。感谢您澄清这一点,不知何故,我一直认为它与querysets一样工作。。