django中如果需要更新數據,有多種方法:
user = Test.objects.filter(name='張小腿')[0]
user.phone = '18822221111'
user.save()
user = Test.objects.get(name='張小腿')
user.phone = '18822221111'
user.save()
Test.objects.filter(name='張小腿').update(phone='18822221111')
我們就看看django在此時做了哪些處理:
使用 connection.queries 可以看到django中執行的所有mysql語句:
from django.db import connection
user = Test.objects.filter(name='張小腿')[0]
user.phone = '18822221111'
user.save()
user = Test.objects.get(name='張小腿')
user.phone = '18822221111'
user.save()
Test.objects.filter(name='張小腿').update(phone='18822221111')
print(connection.queries)
可以看到此時的返回值:
[{u'time': u'0.000', u'sql': u'SET SQL_AUTO_IS_NULL = 0'}, {u'time': u'0.000', u'sql': u'SET SQL_AUTO_IS_NULL = 0'}, {u'time': u'0.001', u'sql': u"SELECT `test_name`.`id`, `test_name`.`phone`, `test_name`.`name`, `test_name`.`item1`, `test_name`.`item2` FROM `test_name` WHERE `test_name`.`name` = '\u5f20\u5c0f\u817f' LIMIT 1"}, {u'time': u'0.000', u'sql': u"UPDATE `test_name` SET `phone` = '18822221111', `name` = '\u5f20\u5c0f\u817f', `item1` = '222', `item2` = '111' WHERE `test_name`.`id` = 1"}, {u'time': u'0.001', u'sql': u"SELECT `test_name`.`id`, `test_name`.`phone`, `test_name`.`name`, `test_name`.`item1`, `test_name`.`item2` FROM `test_name` WHERE `test_name`.`name` = '\u5f20\u5c0f\u817f'"}, {u'time': u'0.001', u'sql': u"UPDATE `test_name` SET `phone` = '18822221111', `name` = '\u5f20\u5c0f\u817f', `item1` = '222', `item2` = '111' WHERE `test_name`.`id` = 1"}, {u'time': u'0.000', u'sql': u"UPDATE `test_name` SET `phone` = '18822221111' WHERE `test_name`.`name` = '\u5f20\u5c0f\u817f'"}]
我們理一下,其中有5條sql語句:
u"SELECT `test_name`.`id`, `test_name`.`phone`, `test_name`.`name`, `test_name`.`item1`, `test_name`.`item2` FROM `test_name` WHERE `test_name`.`name` = '張小腿' LIMIT 1"
u"UPDATE `test_name` SET `phone` = '18822221111', `name` = '張小腿', `item1` = '222', `item2` = '111' WHERE `test_name`.`id` = 1"
u"SELECT `test_name`.`id`, `test_name`.`phone`, `test_name`.`name`, `test_name`.`item1`, `test_name`.`item2` FROM `test_name` WHERE `test_name`.`name` = '張小腿'"
u"UPDATE `test_name` SET `phone` = '18822221111', `name` = '張小腿', `item1` = '222', `item2` = '111' WHERE `test_name`.`id` = 1"
u"UPDATE `test_name` SET `phone` = '18822221111' WHERE `test_name`.`name` = '張小腿'"
可以看到,前兩種方法均爲select之後,update所有字段,包括並沒有更新的字段,區別是使用get時有limit 1的限制,僅會取到1條數據。
而使用.update方法則省去了select過程,效率最高。
所以結論:
在django中,
如果需要更新數據,請一定要使用 .update 方法;
如果需要取出第一條object對象,請一定要使用 .get 方法,而不是.filter[0]。