继续上一次,我们已经可以连接mysql数据库了,而数据库最重要的操作,无非就是增删改查,Django提供了一系列api,用于增删改查,这样可以不使用sql语句来完成数据库操作。
增:
即向数据库插入数据,这里我们在交互式python中来学习,使用python manage.py shell(如果安装了Ipython这些的话,也可以使用它们),然后就是导包,假设,models.py文件为:
from __future__ import unicode_literals
from django.db import models
class Users(models.Model):
username=models.CharField(max_length=20)
password=models.CharField(max_length=20)
那么在交互式shell里,我们导入这个包
from testsql.blog.models import Users
这里testsql是工程名,blog是app名,具体的请根据自己的目录结构来写,写法为,基于manage.py的相对路径。
向数据库插入数据有三种方法:(等同于sql:insert into blog_users (name,password) values ('zhangsan','abc123456'))
1.user=Users(username='zhangsan',password='abc123456')
user.save()
2.Users.objects.create(username='zhangsan',password='abc123456)
3.user=Users()
user.name='zhangsan'
user.password='abc123456'
即通过我们的model对象来创建实例,相应的就可以在数据库中建立与之对应的记录。
查:
首先是全部查找(等同于sql:select * from blog_users)
users=Users.objects.all()
注意这里返回的是Django的内建对象,如果需要获得值,还需要作如下处理:
users_values=users.values()
这样才能获得表中数据的一个列表,然后通过users_values[0]['name']或者users_values[0]['password']就可以获得查找出来的第一个数据的name和password。
然后是条件查找(等同于sql:select * from blog_users where name='zhangsan'):
users=Users.objects.filter(name='zhangsan')
这样就是查找name=zhangsan的记录,同样,这也是一个对象,获取值也需要像上面一样用values。
filter是查找所有满足条件的,而get是找到一个之后就返回(users=Users.objects.get(name='zhangsan')),同样返回的是对象,但无法使用values获得值,这里貌似1.8之前的可以不用values,直接能获得值,但1.8之后的,如果想要获得值的话,那么可以使用property,即在class中定义@property get方法(不清楚的请去看一下python的property,类似于c++这些的get方法),然后其它方法我还真没找到,下面这个又有局限性,请看:
Django提供了一些方法,比如__str__(python3)和__unicode__(python2),它们可以在调用的时候,直接返回值,比如:
User改为:
from __future__ import unicode_literals
from django.db import models
class Users(models.Model):
username=models.CharField(max_length=20)
password=models.CharField(max_length=20)
def __unicode__(self):
return self.username
如果加上__unicode__或者__str__方法之后,那么当使用users=Users.objects.filter(name='zhangsan')或者all,get这些方法获得数据库数据的时候,直接调用users就可以获得值了,但缺点是,只能返回一个,我试着以列表或者元组返回多个会报错,官方文档也只给了返回一个的例子,没有说能不能返回多个。
改和删:
这两个都很简单,一句话说了,它们都是在filter的基础上的,例如:
Users.objects.filter(name='zhangsan').delete()
这样就删除所有name为zhangsan的记录
Users.objects.filter(name='zhangsan').update(password='abc123')
这样就修改所有name为zhangsan的password了。
Django对于数据库操作的API还有很多,想深入研究的可以去官方文档上看看,接下来还剩一个就是原始sql的使用,下次继续。