Django基础之Model操作步骤(介绍)


Posted in Python onMay 27, 2017

一、数据库操作

1、创建model表

基本结构:

#coding:Utf8
from django.db import models
 
class userinfo(models.Model):
 #如果没有models.AutoField,默认会创建一个id的自增列
 name = models.CharField(max_length=30)
 email = models.EmailField()
 memo = models.TextField()

字段解释:

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
参数解释

进行数据的操作

查:

models.UserInfo.objects.all()

models.UserInfo.objects.all().values('user') #只取user列

models.UserInfo.objects.all().values_list('id','user') #取出id和user列,并生成一个列表

models.UserInfo.objects.get(id=1) #取id=1的数据

models.UserInfo.objects.get(user='rose') #取user=‘rose'的数据

增:

models.UserInfo.objects.create(user='rose',pwd='123456')

或者

obj = models.UserInfo(user='rose',pwd='123456')
obj.save()

或者

dic = {'user':'rose','pwd':'123456'}
models.UserInfo.objects.create(**dic)

删:

models.UserInfo.objects.filter(user='rose').delete()

改:

models.UserInfo.objects.filter(user='rose').update(pwd='520')

或者

obj = models.UserInfo.objects.get(user='rose')
obj.pwd = '520'
obj.save()

例举常用方法:

# 获取个数
 #
 # models.Tb1.objects.filter(name='seven').count()
 # 大于,小于
 #
 # 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 则只是第一次创建添加,之后的更新不再改变。

class UserInfo(models.Model):
  name = models.CharField(max_length=32)
  ctime = models.DateTimeField(auto_now=True)
  uptime = models.DateTimeField(auto_now_add=True)
from app01 import models
 def home(request):
  models.UserInfo.objects.create(name='yangmv')
  after = models.UserInfo.objects.all()
  print after[0].ctime
  return render(request, 'app01/home.html')

表结构的修改

表结构修改后,原来表中已存在的数据,就会出现结构混乱,makemigrations更新表的时候就会出错

解决方法:

1、新增加的字段,设置允许为空。生成表的时候,之前数据新增加的字段就会为空。(null=True允许数据库中为空,blank=True允许admin后台中为空)

2、新增加的字段,设置一个默认值。生成表的时候,之前的数据新增加字段就会应用这个默认值

from django.db import models

# Create your models here.
class UserInfo(models.Model):
  name = models.CharField(max_length=32)
  ctime = models.DateTimeField(auto_now=True)
  uptime = models.DateTimeField(auto_now_add=True)
  email = models.EmailField(max_length=32,null=True)
  email1 = models.EmailField(max_length=32,default='rose@qq.com')

执行makemigrations, migrate 后。老数据会自动应用新增加的规则

models.ImageField 图片
models.GenericIPAddressField IP

ip = models.GenericIPAddressField(protocol="ipv4",null=True,blank=True)img = models.ImageField(null=True,blank=True,upload_to="upload")

常用参数

选择下拉框 choices

class UserInfo(models.Model):
  USER_TYPE_LIST = (
   (1,'user'),
 (2,'admin'),
 )
  user_type = models.IntegerField(choices=USER_TYPE_LIST,default=1)

2、连表结构

•一对多:models.ForeignKey(其他表)
•多对多:models.ManyToManyField(其他表)
•一对一:models.OneToOneField(其他表)

应用场景:

•一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)

例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。

•多对多:在某表中创建一行数据是,有一个可以多选的下拉框

例如:创建用户信息,需要为用户指定多个爱好

•一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了

例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据

一对多:

from django.db import models


# Create your models here.
class UserType(models.Model):
 name = models.CharField(max_length=50) 
class UserInfo(models.Model):
 username = models.CharField(max_length=50)
 password = models.CharField(max_length=50)
 email = models.EmailField()
 user_type = models.ForeignKey('UserType')

这是UserInfo表,可以通过外键,对应到UserType表的ID

Django基础之Model操作步骤(介绍)

这是User_Type表的数据

Django基础之Model操作步骤(介绍)

多对多:

from django.db import models


# Create your models here.
class UserType(models.Model):
 name = models.CharField(max_length=50) 
class UserInfo(models.Model):
 username = models.CharField(max_length=50)
 password = models.CharField(max_length=50)
 email = models.EmailField()
 user_type = models.ForeignKey('UserType') 
class UserGroup(models.Model):
 GroupName = models.CharField(max_length=50)
 user = models.ManyToManyField("UserInfo")

Django model会自动创建第3张关系表,用于对应UserInfo_id 和UserGroup_id

UserInfo表如上所示:

UserGroup表

Django基础之Model操作步骤(介绍)

Django自动生成的对应关系表

Django基础之Model操作步骤(介绍)

userinfo_id = 1 为 Boss,属于1(用户组A)

一对一: (一对多增加了不能重复)

from django.db import models


# Create your models here.
class UserType(models.Model):
 name = models.CharField(max_length=50) 
class UserInfo(models.Model):
 username = models.CharField(max_length=50)
 password = models.CharField(max_length=50)
 email = models.EmailField()
 user_type = models.ForeignKey('UserType') 
class UserGroup(models.Model):
 GroupName = models.CharField(max_length=50)
 user = models.ManyToManyField("UserInfo") 
class Admin(models.Model):
 Address = models.CharField()
 user_info_address = models.OneToOneField('UserInfo')

Django基础之Model操作步骤(介绍)

以上这篇Django基础之Model操作步骤(介绍)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python if not in 多条件判断代码
Sep 21 Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
关于Python中浮点数精度处理的技巧总结
Aug 10 Python
Python实现的堆排序算法原理与用法实例分析
Nov 22 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
python实现爬取图书封面
Jul 05 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
python3学生名片管理v2.0版
Nov 29 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
Python调用百度OCR实现图片文字识别的示例代码
Jul 17 Python
python 经纬度求两点距离、三点面积操作
Jun 03 Python
python之PyMongo使用总结
May 26 #Python
Python3安装Pymongo详细步骤
May 26 #Python
Python计时相关操作详解【time,datetime】
May 26 #Python
Python表示矩阵的方法分析
May 26 #Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 #Python
Python简单网络编程示例【客户端与服务端】
May 26 #Python
Python编程对列表中字典元素进行排序的方法详解
May 26 #Python
You might like
php iconv() : Detected an illegal character in input string
2010/12/05 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
深入理解JavaScript系列(47):对象创建模式(上篇)
2015/03/04 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
win10系统中安装scrapy-1.1
2016/07/03 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
Python 判断奇数偶数的方法
2018/12/20 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
详解python数据结构和算法
2019/04/18 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
人力资源本科毕业生求职信
2014/06/04 职场文书
爱护公共设施标语
2014/06/24 职场文书
要账委托书范本
2014/09/15 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
自主招生自荐信范文
2015/03/04 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
解除租赁合同协议书
2016/03/21 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python