过滤器查询的模型对象和Django中的get()查询的对象有什么区别?

时间:2014-08-16 19:30:10

标签: database django orm

我一直在遇到这个问题,我正在尝试使用update()方法更新记录。

当我使用过滤器查询对象时,它总是有效。

my_dictionary = {"key":"Val","another":"Val"}
thing = Thing.objects.filter(pk=1)

thing [0] .update(** my_dictionary)在原始问题中写错了。

thing.update(**my_dictionary)

当我使用get()查询对象时,它一直告诉我该对象没有方法update()

my_dictionary = {"key":"Val","another":"Val"}
thing = Thing.objects.get(pk=1) 
thing.update(**my_dictionary)

在两种情况下,模型对象都不一样吗?为什么一个人有更新方法而另一个没有?任何见解将不胜感激。

2 个答案:

答案 0 :(得分:3)

documentation 非常明确表示:

  

filter()将始终为您提供QuerySet,即使只有一个对象与查询匹配 - 在这种情况下,它将是一个包含单个元素的QuerySet。

     

如果您知道只有一个对象与您的查询匹配,则可以在Manager上使用get()方法直接返回该对象。

您的第一个代码段返回一个QuerySet,它具有更新方法。第二个片段返回一个模型实例,但不是。

请注意,您尚未显示正在使用的确切代码:thing[0].update会使完全与第二个代码段完全相同

答案 1 :(得分:0)

您正在使用QuerySet.update()ModelInstance.save().

如果您只是更新记录而不需要对模型对象执行任何操作,则最有效的方法是调用update(),而不是将模型对象加载到内存中。例如,而不是这样做:

  

e = Entry.objects.get(id = 10)

     

e.comments_on = False

     

e.save()

......这样做:

  

Entry.objects.filter(ID = 10).update(comments_on =假)

https://docs.djangoproject.com/en/1.7/ref/models/querysets/#update