django操作数据库
一:操作语句
假如在app.models中有个模型user
from app.models import User
查询
User.objects.all() # 使用all()方法返回数据库中的所有对象。
User.objects.all().values('name') #只取name列
User.objects.all().values_list('name','age') #取出name和age列,并生成一个列表
User.objects.get(id=1) #如果结果是多个对象或者没有返回结果则会抛出异常
User.objects.get(name='wang')
User.objects.filter(age=12) # 返回一个与参数匹配的QuerySet,相当于等于(=).
User.objects.exclude(age=12) # 返回一个与参数不匹配的QuerySet,相当于不等于(!=)。
User.objects.all()[:5] # 这是查找前5个User表里的数据
Entry.objects.all()[5:10]
Entry.objects.all()[:10:2]
Entry.objects.order_by('headline')[0]
增加
User.objects.create(name='wang',pwd='123456')
obj = User(name='wang',pwd='123456')
obj.save()
dic = {'user':'yangmv','pwd':'123456'}
User.objects.create(**dic)
删除
User.objects.filter(name='wang').delete()
Entry.objects.all().delete() # 删除所有
b = Blog.objects.get(pk=1)
b.delete()
修改
User.objects.filter(name='wang').update(pwd='520')
obj = User.objects.get(name='wang')
obj.pwd = '520'
obj.save()
常用方法
获取记录数
models.Tb1.objects.filter(name='seven').count()
iexact
Blog.objects.get(name__iexact="beatles blog") # 查找name="beatles blog"的对象,不区分大小写。
大于,小于
models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值
models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
in
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
contains包含
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.exclude(name__icontains="ven")
range范围
models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
startswith
istartswith
endswith
iendswith
order by
models.Tb1.objects.filter(name='seven').order_by('id') # asc
models.Tb1.objects.filter(name='seven').order_by('-id') # desc
limit offset
models.Tb1.objects.all()[10:20]
group by
from django.db.models import Count, Min, Max, Sum
models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
二:常用字段设置
models.DateTimeField 日期类型 datetime
参数
auto_now = True :则每次更新都会更新这个时间
auto_now_add 则只是第一次创建添加,之后的更新不再改变。
三:settings设置数据库项
DATABASES ={
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'dbname',
'USER':'root',
'PASSWORD':'xxx',
'HOST':'',
'PORT':'',
}
}
建数据库语句
create database WEIXIN default character set utf8 collate utf8_general_ci;
建完数据库,让django根据models文件生成建表语句
python manage.py makemigrations
根据建表语句,在数据库中建表
python manage.py migrate
创建超级用户,用于登录admin页面
python manage.py createsuperuser
四:查询外键
我先定义两个模型,一个是作者,一个是作者出版的书籍,一个作者对应多个书籍,算是一对多的类型。
class Person(models.Model);
name = models.CharField('作者姓名', max_length=10)
age = models.IntegerField('作者年龄')
class Book(models.Model):
person = models.ForeignKey(Person, related_name='person_book')
title = models.CharField('书籍名称', max_length=10)
pubtime = models.DateField('出版时间')
如果我们要查询一个作者出版了哪些书籍的话,那我们要怎么做呢?
先查询到作者的信息
person = Person.objects.fiter(你的条件)
返回一个person对象
接下来就查询person关联的所有书籍对象
book = person.book_set.all()
django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。
这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续的根据情况来查询等操作。
如果你觉得上面的定义比较麻烦的话,你也可以在定义主表的外键的时候,给这个外键定义好一个名称。要用related_name比如:
person = models.ForeignKey(Person, related_name='person_set')
那么上面的话:book = person.book_set.all()
也可以用book = person.person_set.all()
上面的是查询是通过主表来查询子表的信。
下面我简单的说下通过子表来查询主表的信息。
假设我要查询一本书籍所关联的作者的信息,那我可以通过下面的步骤来实现:
假如我先得到了一个子表的对象。那我只要获取该对象关联主表的外键的熟悉,就可以得到主表的信息了。
比如我得到一个book对象,然后我想得到book对象的主表person的信息的话:
p = book.person
附: 字段类型+参数
字段类型
1、models.AutoField 自增列= int(11)
如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField 字符串字段
必须 max_length 参数
3、models.BooleanField 布尔类型=tinyint(1)
不能为空,Blank=True
4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar
继承CharField,所以必须 max_lenght 参数
5、models.DateField 日期类型 date
对于参数,auto_now =True则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField 日期类型 datetime
同DateField的参数
7、models.Decimal 十进制小数类型= decimal
必须指定整数位max_digits和小数位decimal_places
8、models.EmailField 字符串类型(正则表达式邮箱)=varchar
对字符串进行正则表达式
9、models.FloatField 浮点类型= double
10、models.IntegerField 整形
11、models.BigIntegerField 长整形
integer_field_ranges ={
‘SmallIntegerField’:(-32768,32767),
‘IntegerField’:(-2147483648,2147483647),
‘BigIntegerField’:(-9223372036854775808,9223372036854775807),
‘PositiveSmallIntegerField’:(0,32767),
‘PositiveIntegerField’:(0,2147483647),
}
12、models.IPAddressField 字符串类型(ip4正则表达式)
13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)
参数protocol可以是:both、ipv4、ipv6
验证时,会根据设置报错
14、models.NullBooleanField 允许为空的布尔类型
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 减号、下划线、字母、数字
18、models.SmallIntegerField 数字
数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField 字符串=longtext
20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字符串,地址正则表达式
22、models.BinaryField 二进制
23、models.ImageField图片
24、models.FilePathField文件
参数
1、null=True
数据库中字段是否可以为空
2、blank=True
django的Admin中添加数据时是否可允许空值
3、primary_key =False
主键,对AutoField设置主键后,就会代替原来的自增 id 列
4、auto_now 和 auto_now_add
auto_now 自动创建—无论添加或修改,都是当前操作的时间
auto_now_add 自动创建—永远是创建时的时间
5、choices
GENDER_CHOICE =(
(u’M’, u’Male’),
(u’F’, u’Female’),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default 默认值
8、verbose_name Admin中字段的显示名称
9、name|db_column 数据库中的字段名称
10、unique=True 不允许重复
11、db_index =True 数据库索引
12、editable=True 在Admin里是否可编辑
13、error_messages=None 错误提示
14、auto_created=False 自动创建
15、help_text 在Admin中提示帮助信息
16、validators=[]
17、upload-to