django model对象修改_django之模型层(model)--添加、单表查询、修改基础

上篇带大家简单做了一下图书表的创建、简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改还是删除等很多操作都是建立在查数据的基础上。

本篇导航:

今天所有例子用的延续上篇的数据库,book表也是延续上篇,接着昨天的建表,删除等功能扩展其他功能,所以有所疑问的可以先看上篇随笔:

一、添加

1、添加表记录

1)方式一

book_obj = models.Book(nid=nid,title=title,author=author,publishDate=publishDate,price=price)

book_obj.save()#将数据保存到数据库

2)方式二

#book_obj可以得到返回值

book_obj=models.Book.objects.create(title=title,author=author,publishDate=publishDate,price=price)

2、template模版

1)首页的添加按钮

添加书籍

2)添加页面的提交表单

{% csrf_token %}

提交

{% csrf_token %}之前说过 安全机制 在post请求中使用

3、url 分发

url(r'^add/', views.addBook),

4、视图函数views

defaddBook(request) :if request.method == "POST":

nid= request.POST.get("nid")

title= request.POST.get("title")

author= request.POST.get("author")

publishDate= request.POST.get("publishDate")

price= request.POST.get("price")#book_obj = models.Book(title=title,author=author,publishDate=publishDate,price=price)

#book_obj.save() # 将数据保存到数据库

book_obj = models.Book.objects.create(title=title, author=author, publishDate=publishDate, price=price)return redirect("/index/")return render(request, "add.html")

先讲拿到表单提交的数据 然后添加到表

添加表用那一个方式都可以 推荐方式二

二、单表查询

1、查询相关API

一定区分object与querySet的区别

昨天已做介绍:<1>all():<2>filter():<3>get():

返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。(慎用)<4>exclude():

它包含了与所给筛选条件不匹配的对象<5>values():

返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列<6>values_list():

它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列<7>order_by():

对查询结果排序<8>reverse():

对查询结果反向排序<9>distinct():

从返回结果中剔除重复纪录<10>count():

返回数据库中匹配查询(QuerySet)的对象数量。<11>first():

返回第一条记录<12>last():

返回最后一条记录<13>exists():

如果QuerySet包含数据,就返回True,否则返回False

View Code

例如: <2>filter(nid=nid,title=title) ','可以起到数据库and的作用两个条件关系为且,在括号里并不能实现‘或’的条件关系,后面的随笔会随后一一介绍。

2、双下划线之单表查询

1 models.Tb1.objects.filter(id__lt=10, id__gt=1) #获取id大于1 且 小于10的值#__lte,__gte 小于等于 大于等于

2 models.Tb1.objects.filter(id__in=[11, 22, 33]) #获取id等于11、22、33的数据

3 models.Tb1.objects.exclude(id__in=[11, 22, 33]) #not in

4 models.Tb1.objects.filter(name__contains="ven") #模糊查询

5 models.Tb1.objects.filter(name__icontains="ven") #icontains大小写不敏感

6 models.Tb1.objects.filter(id__range=[1, 2]) #范围bettwen and

7 startswith,istartswith, endswith, iendswith

3、通过logging可以查看翻译成的sql语句

LOGGING ={'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',

},

},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',

},

}

}

将上面代码粘贴到setting配置文件里,当你的操作与数据库相关时 会将我们的写的语句翻译成sql语句在服务端打印。

4、以下代码只为测试sql语句和单表查询示例

1)url 分发

url(r'^query/', views.query),

2)视图函数views

defquery(request):#查询方法API:

#1 all: models.表名.objects.all()

#book_all = models.Book.objects.all() # 结果是querySet集合 [model对象,....]

#print(book_all) # , , ]>

#2 filter: models.表名.objects.filter() # 结果是querySet集合 [model对象,....]

#ret1=models.Book.objects.filter(author="yuan") # # , ]>

#ret2=models.Book.objects.filter(nid=1) # ]>

#ret2=models.Book.objects.filter(author="yuan",price=123) # ]>

#print(ret2)

#3 get models.表名.objects.get() # model对象

#ret3=models.Book.objects.get(author="yuan")

#print(ret3.price)

#exclude : 排除条件

#ret4=models.Book.objects.exclude(author="yuan")

#print(ret4)

#values方法

#ret=models.Book.objects.filter(author="yuan").values("title","price")

#print(ret)#

#ret = models.Book.objects.filter(author="yuan").values_list("title", "price")

#print(ret) #

#ret=models.Book.objects.filter(author="yuan").values("author").distinct()

#print(ret)

#count方法

#ret=models.Book.objects.filter(author="yuan").count()

#print(ret)

#first 方法

ret =models.Book.objects.all().first()print(ret)#exists方法

#if models.Book.objects.all().exists():

#print("exists")

#else:

#print("nothing")

#ret = models.Book.objects.filter(price__gt=100)

#ret = models.Book.objects.filter(price__gte=99) # 大于等于

#ret=models.Book.objects.filter(publishDate__year=2017,publishDate__month=10)

#ret=models.Book.objects.filter(author__startswith="张")

#print(ret)

return HttpResponse("OK")

以 first 方法为例

从此处可以看出我们虽然在操作数据库时没有写sql语句,但是django将我们写的语句翻译成了sql语句

三、修改

1、修改表记录

修改表记录和添加表记录同样都有两个方法,我们在视图函数views里看修改表记录的具体应用

nid = request.POST.get("nid")

title=request.POST.get("title")

author=request.POST.get("author")

publishDate=request.POST.get("publishDate")

price=request.POST.get("price")#修改方式1:save(效率低)#book_obj=models.Book.objects.filter(nid=id)[0]#修改书名示例:#book_obj.title="py2"#book_obj.save()

#修改方式2:(推荐)

models.Book.objects.filter(nid=nid).update(title=title,author=author,publishDate=publishDate,price=price)return redirect("/index/")

2、url 分发

url(r'^edit/(\d+)', views.editBook),

3、template模版

1)主页修改按钮

编辑

2)数据来源和添加表数据相同 由template模版的form表单提交 不同的是修改的表单内需要默认原来的数据

{% csrf_token %}{{ forloop.counter}}

保存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值