Django之常用ORM操作

来自CloudWiki
跳转至: 导航搜索

技术要点

1)ORM是指Object Relational Mapping的缩写,可以看作是对关系型数据库的封装。每个类对应数据库里的一个表,类的每个数据成员对应表中的一个字段,类的每个对象对应于表中的一条记录。

2)ORM操作是对SQL语句的封装,每个操作都可以使用对应的SQL语句实现。

3)文中的ORM操作语句同样可以在网页中根据需要进行调用

导入模型

打开powershell

在资源管理器中进入到网站项目文件夹,按下键盘上的Shift,然后在空白处单击鼠标右键,然后单击“在此处打开Powershell窗口”,本系列教程均在Win 10下演示。

文件:Python10-5.png

进入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 []>

参考文档:

http://mp.weixin.qq.com/s?__biz=MzI4MzM2MDgyMQ==&mid=2247488652&idx=1&sn=4cebbccfaf9134618e7d56b011bd6733&chksm=eb8abfd6dcfd36c0922e2d2832e7f8ba140c7da90f4a770f2e3634a7d1d15b9349572faa09cc&mpshare=1&scene=23&srcid=0121KSRmmU11qXxj3iVrM40T#rd