一, 添加表记录
对于单表有两种方式
- # 添加数据的两种方式
- # 方式一: 实例化对象就是一条表记录
- Frank_obj = models.Student(name ="海东",course="python",birth="2000-9-9",fenshu=80)
- Frank_obj.save()
- # 方式二:
- models.Student.objects.create(name ="海燕",course="python",birth="1995-5-9",fenshu=88)
二, 查询表记录
查询相关 API
- # 查询相关 API
- # 1,all(): 查看所有
- student_obj = models.Student.objects.all()
- print(student_obj) #打印的结果是 QuerySet 集合
- # 2,filter(): 可以实现且关系, 但是或关系需要借助 Q 查询实现...
- # 查不到的时候不会报错
- print(models.Student.objects.filter(name="Frank")) #查看名字是 Frank 的
- print(models.Student.objects.filter(name="Frank",fenshu=80)) #查看名字是 Frank 的并且分数是 80 的
- # 3,get(): 如果找不到就会报错, 如果有多个值, 也会报错, 只能拿有一个值的
- print(models.Student.objects.get(name="Frank")) #拿到的是 model 对象
- print(models.Student.objects.get(nid=2)) #拿到的是 model 对象
- # 4,exclude(): 排除条件
- print( models.Student.objects.exclude(name="海东")) #查看除了名字是海东的信息
- # 5,values(): 是 QuerySet 的一个方法 (把对象转换成字典的形式)
- print(models.Student.objects.filter(name="海东").values("nid","course")) #查看名字为海东的编号和课程
- #打印结果:<QuerySet [{'nid': 2, 'course': 'python'}, {'nid': 24, 'course': 'python'}]>
- # 6,values_list(): 是 queryset 的一个方法 (把对象转成元组的形式)
- print(models.Student.objects.filter(name="海东").values_list("nid", "course"))
- #打印结果:<QuerySet[(2, 'python'), (24, 'python')]>
- # 7,order_by(): 排序
- print(models.Student.objects.all().order_by("fenshu"))
- # 8,reverse(): 倒序
- print(models.Student.objects.all().reverse())
- # 9,distinct(): 去重(只要结果里面有重复的)
- print(models.Student.objects.filter(course="python").values("fenshu").distinct())
- # 10,count(): 查看有几条记录
- print(models.Student.objects.filter(name="海东").count())
- # 11,first()
- # 12,last()
- return render(request,"test.html",{"student_obj":student_obj})
- # 13,exists: 查看有没有记录, 如果有返回 True, 没有返回 False
- # 并不需要判断所有的数据,
- # if models.Book.objects.all().exists():
双下划线之单表查询
- models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取 id 小于 1 且 大于 10 的值
- models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取 id 等于 11,22,33 的数据
- models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
- models.Tb1.objects.filter(name__contains="ven") #包括 ven 的
- models.Tb1.objects.filter(name__icontains="ven") # icontains 大小写不敏感
- models.Tb1.objects.filter(id__range=[1, 2]) # 范围 bettwen and
- startswith,istartswith, endswith, iendswith
对象可以调用自己的属性, 用一个点就可以
还可以通过双下划线...
models.Book.objects.filter(price__gt=100) 价格大于 100 的书
models.Book.objects.filter(author__startwith= "张") 查看作者的名字是以张开头的
主键大于 5 的且小于 2
price__gte=99 大于等于
publishDate__year =2017,publishDate__month = 10 查看 2017 年 10 月份的数据
三, 修改表记录
注意:
<1> 第二种方式修改不能用 get 的原因是: update 是 QuerySet 对象的方法, get 返回的是一个 model 对象, 它没有 update 方法, 而 filter 返回的是一个
QuerySet 对象 (filter 里面的条件可能有多个条件符合, 比如 name='alvin', 可能有两个 name='alvin'的行数据).
<2 > 在 "插入和更新数据" 小节中, 我们有提到模型的 save()方法, 这个方法会更新一行里的所有列. 而某些情况下, 我们只需要更新行里的某几列.
此外, update()方法对于任何结果集 (QuerySet) 均有效, 这意味着你可以同时更新多条记录 update()方法会返回一个整型数值, 表示受影响的记录条数.
注意, 这里因为 update 返回的是一个整形, 所以没法用 query 属性; 对于每次创建一个对象, 想显示对应的 raw sql, 需要在 settings 加上日志记录部分
四, 删除表记录
删除方法就是 delete(). 它运行时立即删除对象而不返回任何值. 例如: e.delete()
- def delstudent(request,id):
- # 删除数据
- models.Student.objects.filter(nid=id).delete()
- return redirect("/test/")
你也可以一次性删除多个对象. 每个 QuerySet 都有一个 delete() 方法, 它一次性删除 QuerySet 中所有的对象.
例如, 下面的代码将删除 pub_date 是 2005 年的 Entry 对象:
Entry.objects.filter(pub_date__year=2005).delete()
要牢记这一点: 无论在什么情况下,, 而并不是分别删除每个对象.
如果你想使用在 model 中自定义的 delete() 方法, 就要自行调用每个对象的 delete 方法.(例如, 遍历 QuerySet, 在每个对象上调用 delete()方
法), 而不是使用 QuerySet 中的 delete()方法.
在 Django 删除对象时, 会模仿 SQL 约束 ON DELETE CASCADE 的行为, 换句话说, 删除一个对象时也会删除与它相关联的外键对象. 例如:
- b = Blog.objects.get(pk=1)
- # This will delete the Blog and all of its Entry objects.
- b.delete()
要注意的是: delete() 方法是 QuerySet 上的方法, 但并不适用于 Manager 本身. 这是一种保护机制, 是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除. 如果你确认要删除所有的对象, 那么你必须显式地调用:
Entry.objects.all().delete()
五, 编辑表格中的内容的涉及到的语法
编辑操作涉及到的语法
分析:
1, 点击编辑, 让跳转到另一个页面, 拿到我点击的那一行
两种取 id 值的方式
方式一:
利用数据传参数(作为数据参数传过去了)
<a href="/edit/?book_id = {{book_obj.nid}}"></a> #相当于发了一个键值对
url 里面就不用写匹配的路径了,
id = request.GET.get("book_id") #取值
方式二:
利用路径传参, 得在 url 里面加上(\d+), 就得给函数传个参数, 无名分组从参数里面取值
<a href="/{{book_obj.nid}}"></a>
2, 拿到 id, 然后在做筛选
- id = request.GET.get("book_id")
- book_obj = models.Book.objects.filter(nid=id) #拿到的是一个列表对象
注意:
1. 取 [0] 就拿到对象了,, 然后对象. 属性就可以取到值了
2. 用 get, 你取出来的数据必须只有一条的时候,, 如果有多条用 get 就会报错,,, 但是用 get 就不用加 [0] 了
book_obj = models.Book.objects.filter(nid=id)[0]
3, 当点击编辑的时候怎么让 input 框里显示文本内容
value = "{{book_obj.title}}"
4, 改完数据后重新提交
当提交的时候走 action...../edit/}
隐藏一个 input,
<input type="hidden" name = "book_id" value="{{book_obj.nid}}">
判断 post 的时候:
修改数据
方式一: save(这种方式效率是非常低的, 不推荐使用, 了解就行了)
修改的前提是先取(拿到要编辑的 id 值)
- id = request.POST.get("book_id")
- bk_obj = models.Book.objects.filter(nid=id)[0]
- bk_obj.title = "hhhhhh" #这是写死了, 不能都像这样写死了
bk_obj.save() 只要是用对象的这种都要. save
方式二: update
- title = request.POST.get("title")
- models.Book.objects.filter(nid=id).update(title=title,......)
跳转到 index
如果是 post 请求的时候怎么找到 id 呢,
一, 如果是数据传参:(也就是 get 请求的时候)
可以通过一个隐藏的 input 框, 给这个框给一个 name 属性, value 属性. 通过 request.POST.get("键"),, 就可以得到 id 的值
二, 如果是路径传参
可以通过传参的形式, 当正则表达式写一个 (\d+) 的时候, 就给函数传一个 id, 可通过这个 id 知道 id.
来源: http://www.bubuko.com/infodetail-2857420.html