Django之常用ORM操作
来自CloudWiki
技术要点
1)ORM是指Object Relational Mapping的缩写,可以看作是对关系型数据库的封装。每个类对应数据库里的一个表,类的每个数据成员对应表中的一个字段,类的每个对象对应于表中的一条记录。
2)ORM操作是对SQL语句的封装,每个操作都可以使用对应的SQL语句实现。
3)文中的ORM操作语句同样可以在网页中根据需要进行调用。
导入模型
打开powershell
在资源管理器中进入到网站项目文件夹,按下键盘上的Shift,然后在空白处单击鼠标右键,然后单击“在此处打开Powershell窗口”,本系列教程均在Win 10下演示。
进入Powershell窗口,执行下图中的命令,进入shell,然后导入前面课程中创建并导入了数据的Question模型。
PS D:\teaching\python\实训\onLinePythonLearning> python manage.py shell Python 3.7.0a3 (v3.7.0a3:90a6785, Dec 5 2017, 22:50:42) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from questions3.models import Question3
执行操作
查询数据
执行语句,查询数据。
#查询记录总数 >>> Question3.objects.all().count() 2 #查询所有记录 >>> Question3.objects.all() <QuerySet [<Question3: Question3 object (1)>, <Question3: Question3 object (2)>]> #查询所有记录的值 >>> Question3.objects.all().values() <QuerySet [{'id': 1, 'questionContent': '26个英文字母的首字母是:', 'option_a': 'a', 'option_b': 'b', 'option_c': 'c', 'option_d': 'd', 'answer': 'a'}, {'id': 2, 'questionContent': '给出如下代码\n\ns= "abcdefghijklmn"\n\nprint(s[1:10:3])上 述代码的输出结果是', 'option_a': 'adg', 'option_b': 'adgj', 'option_c': 'beh', 'option_d': '.behk', 'answer': 'c'}]> #查询所有记录指定字段的值 >>> Question3.objects.all().values('answer') <QuerySet [{'answer': 'a'}, {'answer': 'c'}]> >>> Question3.objects.all().values('id','answer') <QuerySet [{'id': 1, 'answer': 'a'}, {'id': 2, 'answer': 'c'}]> #查询id为1的值 >>> Question3.objects.get(id=1) <Question3: Question3 object (1)> >>> Question3.objects.get(id=1).questionContent '26个英文字母的首字母是:' >>> Question3.objects.get(id=1).answer 'a' #查询answer字段是a的记录 >>> Question3.objects.get(answer='a') <Question3: Question3 object (1)> #查询answer字段包含a的记录,get方法只能返回一个记录,如果多于一个就抛出异常 >>> Question3.objects.get(answer__contains='a') <Question3: Question3 object (1)> #如果符合条件的记录多于一个,就使用filter >>> Question3.objects.filter(answer__contains='c') <QuerySet [<Question3: Question3 object (2)>]> >>> #查询以‘给出’开始的questionContent字段的记录 Question3.objects.filter(questionContent__startswith='给出') <QuerySet [<Question3: Question3 object (2)>]> >>> Question3.objects.filter(questionContent__startswith='给出').values() <QuerySet [{'id': 2, 'questionContent': '给出如下代码\n\ns= "abcdefghijklmn"\n\nprint(s[1:10:3])上述代码的输出结果是', 'option_a': 'adg', 'option_b': 'adgj', 'option_c': 'beh', 'option_d': '.behk', 'answer': 'c'}]> #查询id为1的记录 >>> Question3.objects.filter(id=1) <QuerySet [<Question3: Question3 object (1)>]> #查询id大于1的记录 >>> Question3.objects.filter(id__gt=1) <QuerySet [<Question3: Question3 object (2)>]> #查询id小于2的记录 >>> Question3.objects.filter(id__lt=2) <QuerySet [<Question3: Question3 object (1)>]> >>> Question3.objects.filter(id__lt=2).count() 1 #查询id小于等于2的记录 >>> Question3.objects.filter(id__lte=2) <QuerySet [<Question3: Question3 object (1)>, <Question3: Question3 object (2)>]> >>>
增加记录
执行语句,增加记录。
>>> t = Question3.objects.create(questionContent='test',answer='测试') >>> t <Question3: Question3 object (3)> >>> Question3.objects.all().values('id','answer') <QuerySet [{'id': 1, 'answer': 'a'}, {'id': 2, 'answer': 'b'}, {'id': 3, 'answer': '测试'}]> >>> for item in Question3.objects.filter(id__lte=3).values(): ... print(item) ... {'id': 1, 'questionContent': '26个英文字母的首字母是:', 'option_a': 'a', 'option_b': 'b', 'option_c': 'c', 'option_d': 'd', 'answer': 'a'} {'id': 2, 'questionContent': '给出如下代码\n\ns= "abcdefghijklmn"\n\nprint(s[1:10:3])上述代码的输出结果是', 'option_a': 'adg', 'option_b': 'adgj', 'option_c': 'beh', 'option_d': '.behk', 'answer': 'b'} {'id': 3, 'questionContent': 'test', 'option_a': '', 'option_b': '', 'option_c': '', 'option_d': '', 'answer': '测试'} >>>
方法2:
>>> s = Question3(questionContent='test2',answer='测试2') >>> s.save() >>> Question3.objects.all().values('id','answer') <QuerySet [{'id': 1, 'answer': 'a'}, {'id': 2, 'answer': 'b'}, {'id': 3, 'answer': '测试'}, {'id': 4, 'answer': '测试2'}]>
修改记录
执行语句,修改记录。
>>> Question3.objects.filter(id=2).values('answer') <QuerySet [{'answer': 'c'}]> >>> Question3.objects.filter(id=2).update(answer='b') 1 >>> Question3.objects.all().values('id','answer') <QuerySet [{'id': 1, 'answer': 'a'}, {'id': 2, 'answer': 'b'}]>
删除记录
执行语句,删除记录。
>>> Question3.objects.filter(id__gte=3).values() <QuerySet [{'id': 3, 'questionContent': 'test', 'option_a': '', 'option_b': '', 'option_c': '', 'option_d': '', 'answer': '测试'}, {'id': 4, 'questionContent': 'test2', 'option_a': '', 'option_b': '', 'option_c': '', 'option_d': '', 'answer': '测试2'}]> >>> Question3.objects.filter(id__gte=3).delete() (2, {'questions3.Question3': 2}) >>> Question3.objects.filter(id__gte=3).values() <QuerySet []>
参考文档: