我一直在遇到这个问题,我正在尝试使用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)
在两种情况下,模型对象都不一样吗?为什么一个人有更新方法而另一个没有?任何见解将不胜感激。
答案 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