Django对models层数据库的增删改查操作
前提已掌握Django的基本初始化操作以及对整体框架的了解
一、首先在models层创建一个数据表(注意在admin里注册model并且初始化数据库(makemigrations、migrate))
1 from django.db import models 2 3 # Create your models here. 4 5 6 class MqttData(models.Model): 7 8 topic = models.CharField(max_length=100, verbose_name="话题") 9 msg = models.CharField(max_length=300, verbose_name="消息") 10 11 def __str__(self): 12 return self.msg
二、在需要进行数据库操作的地方import models: from app名 import models
三、做增删改查操作
①、查
1 models.UserInfo.objects.all() 2 models.UserInfo.objects.all().values('topic') #只取user列 3 models.UserInfo.objects.all().values_list('topic','msg') #取出topic和msg列,并生成一个列表 4 models.UserInfo.objects.get(topic="data/receive") 5 models.UserInfo.objects.get(msg="success")
②、增
1 models.UserInfo.objects.create(user='yangmv',pwd='123456') 2 或者 3 obj = models.UserInfo(user='yangmv',pwd='123456') 4 obj.save() 5 或者 6 dic = {'user':'yangmv','pwd':'123456'} 7 models.UserInfo.objects.create(**dic)
③、删
1 models.UserInfo.objects.filter(user='yangmv').delete()
④、改
1 models.UserInfo.objects.filter(user='yangmv').update(pwd='520') 2 或者 3 obj = models.UserInfo.objects.get(user='yangmv') 4 obj.pwd = '520' 5 obj.save()
四、常用方法
1 # 获取个数 2 # 3 # models.Tb1.objects.filter(name='seven').count() 4 # 大于,小于 5 # 6 # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值 7 # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值 8 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 9 # in 10 # 11 # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 12 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in 13 # contains 14 # 15 # models.Tb1.objects.filter(name__contains="ven") 16 # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 17 # models.Tb1.objects.exclude(name__icontains="ven") 18 # range 19 # 20 # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and 21 # 其他类似 22 # 23 # startswith,istartswith, endswith, iendswith, 24 # order by 25 # 26 # models.Tb1.objects.filter(name='seven').order_by('id') # asc 27 # models.Tb1.objects.filter(name='seven').order_by('-id') # desc 28 # limit 、offset 29 # 30 # models.Tb1.objects.all()[10:20] 31 # group by 32 from django.db.models import Count, Min, Max, Sum 33 # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) 34 # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
五、关联数据库表
- 一对多:models.ForeignKey(其他表)
- 多对多:models.ManyToManyField(其他表)
- 一对一:models.OneToOneField(其他表)
应用场景:
- 一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。- 多对多:在某表中创建一行数据是,有一个可以多选的下拉框
例如:创建用户信息,需要为用户指定多个爱好- 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了
例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据
1
2
3
4
5
6
|
class Game(models.Model): gname = models.CharField(max_length = 32 ) class Host(models.Model): hostname = models.CharField(max_length = 32 ) game = models.ForeignKey( 'Game' ) |
六、models的字段类型
1、models.AutoField ---自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField ---字符串字段 单行输入,用于较短的字符串,如要保存大量文本, 使用 TextField。必须 max_length 参数,django会根据这个参数在数据库层和校验层限制该字段所允许的最大字符数。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 对字符串进行正则表达式 一个带有检查 Email 合法性的 CharField,不接受 maxlength 参数。
9、models.FloatField ---浮点类型 = double 浮点型字段。 必须提供两个 参数, 参数描述:max_digits:总位数(不包括小数点和符号)
decimal_places:小数位数。如:要保存最大值为 999 (小数点后保存2位),你要这样定义字段:models.FloatField(…,max_digits=5, decimal_places=2),要保存最大值一百万(小数点后保存10位)的话,你要这样定义:models.FloatField(…,max_digits=19, decimal_places=10)
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正则表达式) 一个字符串形式的 IP 地址, (如 “202.1241.30″)。
13、models.GenericIPAddressField ---字符串类型(ip4和ip6是可选的) 参数protocol可以是:both、ipv4、ipv6 验证时,会根据设置报错
14、models.NullBooleanField ---允许为空的布尔类型 类似 BooleanField, 不过允许 NULL 作为其中一个选项。 推荐使用这个字段而不要用 BooleanField 加 null=True 选项。 admin 用一个选择框 <select> (三个可选择的值: “Unknown”, “Yes” 和 “No” ) 来表示这种字段数据。
15、models.PositiveIntegerField ---正Integer 类似 IntegerField, 但取值范围为非负整数(这个字段应该是允许0值的…可以理解为无符号整数)
16、models.PositiveSmallIntegerField ---正smallInteger 正小整型字段,类似 PositiveIntegerField, 取值范围较小(数据库相关)SlugField“Slug” 是一个报纸术语。 slug 是某个东西的小小标记(短签), 只包 含字母,数字,下划线和连字符。它们通常用于URLs。 若你使用 Django 开发版本,你可以指定 maxlength。 若 maxlength 未指定, Django 会使用默认长度: 50,它接受一个额外的参数:prepopulate_from: 来源于slug的自动预置列表
17、models.SlugField ---减号、下划线、字母、数字 它们通常用于URLs。
18、models.SmallIntegerField ---数字 数据库中的字段有:tinyint、smallint、int、bigint. 类似 IntegerField, 不过只允许某个取值范围内的整数。(依赖数据库)
19、models.TextField ---字符串=longtext ,一个容量很大的文本字段, admin 管理界面用 <textarea>多行编辑框表示该字段数据。20、models.TimeField ---时间 HH:MM[:ss[.uuuuuu]] 时间字段,类似于 DateField 和 DateTimeField。
21、models.URLField ---字符串,地址正则表达式 用于保存URL。若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在(即URL是否被有效装入且没有返回404响应).
22、models.BinaryField ---二进制
23、models.ImageField ---图片 类似 FileField, 不过要校验上传对象是否是一个合法图片。它有两个可选参数:height_field 和 width_field,如果提供这两个参数,则图片将按提供的高度和宽度规格保存。 该字段要求 Python Imaging 库。
24、models.FilePathField ---选择指定目录按限制规则选择文件,有三个参数可选, 其中”path”必需的,这三个参数可以同时使用, 参数描述:path:必需参数,一个目录的绝对文件系统路径。 FilePathField 据此得到可选项目。 Example: “/home/images”;
match:可选参数, 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名。 注意这个正则表达式只会应用到 base filename 而不是路径全名。 Example: “foo。*\。txt^”, 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif;
recursive:可选参数, 是否包括 path 下全部子目录,True 或 False,默认值为 False。
match 仅应用于 base filename, 而不是路径全名。 如:FilePathField(path=”/home/images”, match=”foo.*”, recursive=True)…会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
25、models.FileField ---文件上传字段。 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径。 这个路径必须包含 strftime formatting, 该格式将被上载文件的 date/time 替换(so that uploaded files don’t fill up the given directory)。在一个 model 中使用 FileField 或 ImageField 需要以下步骤:在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件。 (出于性能考虑,这些文件并不保存到数据库。) 定义 MEDIA_URL 作为该目录的公共 URL。 要确保该目录对 WEB 服务器用户帐号是可写的。在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django 使用 MEDIA_ROOT 的哪个子目录保存上传文件。你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT)。 出于习惯你一定很想使用 Django 提供的 get_<fieldname>_url 函数。举例来说,如果你的 ImageField 叫作 mug_shot, 你就可以在模板中以 {{ object。get_mug_shot_url }} 这样的方式得到图像的绝对路径。
26、models.PhoneNumberField ---一个带有合法美国风格电话号码校验的 CharField(格式:XXX-XXX-XXXX)
27、models.USStateField ---美国州名缩写,由两个字母组成(天朝人民无视)。
28、models.XMLField ---XML字符字段,校验值是否为合法XML的 TextField,必须提供参数:
schema_path:校验文本的 RelaxNG schema 的文件系统路径。