ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python中django ORM-models的基本操作

2019-09-11 14:40:35  阅读:231  来源: 互联网

标签:name Python Tb1 db cursor models objects 基本操作


文章目录

django ORM

seting配置

使用mysql数据库,settings中配置如下:
	DATABASES = {
	    'default': {
	        'ENGINE': 'django.db.backends.mysql',
	        'NAME': 'student',
	        'USER': 'root',
	        'PASSWORD': 'root',
	        'HOST': '127.0.0.1',
	        'PORT': '3306',
	    }
	}
安装mysql依赖包:
	pip install -i https://pypi.douban.com/simple mysqlclient
如安装该包出错。下载新包:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient

参考在django中使用mysql数据库: https://www.cnblogs.com/fengri/articles/django5.html

安装mysqlclient

一、在windows下安装:

·如果直接使用 pip install mysqlclient 会提示安装失败(版本不对或者找不到包)

·正确安装步骤:

  1. 下载对应版本的 mysqlclient 安装文件:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
    2. 进入 mysqlclient 文件目录,使用 pip install mysqlclient文件名 进行安装

注意:也可以 或者降低django版本到2.1以下

django admin后台系统

​ Django中默认集成了后台数据管理页面,通过简单的配置就可以实现模型后台的Web控制台。
​ 管理界面通常是给系统管理员使用的,用来完成数据的输入,删除,查询等工作。

​ 使用以下models来示范admin后台系统的用法。
​ 1.创建对应的models

	from django.db import models


​ class Publisher(models.Model):
​ name = models.CharField(max_length=30)
​ address = models.CharField(max_length=50)
​ city = models.CharField(max_length=60)
​ state_province = models.CharField(max_length=30)
​ country = models.CharField(max_length=50)
​ website = models.URLField()

	class Author(models.Model):
	    first_name = models.CharField(max_length=30)
	    last_name = models.CharField(max_length=40)
	    email = models.EmailField()
	class Book(models.Model):
	    title = models.CharField(max_length=100)
	    authors = models.ManyToManyField(Author)
	    publisher = models.ForeignKey(Publisher)
	    publication_date = models.DateField()

2 使用admin后台系统之前,需要先创建一个系统管理员,创建管理员之前需先同步数据库。
	python manager.py createsuperuser
	
2.1设置为中文
	settings中LANGUAGE_CODE = 'zh-hans'

2.2设置时间,时区
	TIME_ZONE='Asia/Shanghai'
    
2.3 给模型加上__str__函数,比如给Author模型添加str函数,后台的显示更加友好:
	    def __str__(self):
      return u'%s %s' % (self.first_name, self.last_name)
3 添加自己的数据模型
	在admin.py中注册
	admin.site.register(Publisher)
	admin.site.register(Author)
	admin.site.register(Book)
4.数据迁移
python manage.py makemigrations
python manage.py migrate

    
admin中添加model数据时的动作,可以修改相应字段的属性。比如author的email字段运行添加的时候为空。
在email字段定义中加上blank=True,又比如给book的publication_date添加blank=True, null=True属性。
修改models属性之后记得及时做数据迁移。 python manage.py migrate
使用verbose_name属性指定字段的别名。比如给publisher的name字段指定一个中文的别名verbose_name='出版社名称'。在models的修改页面,默认显示的是models定义的str函数返回的字符串。

models 定义属性

概述

​ django根据属性的类型确定以下信息
​ ·当前选择的数据库支持字段的类型
​ ·渲染管理表单时使用的默认html控件
​ ·在管理站点最低限度的验证

属性命名限制

​ ·遵循标识符规则
​ ·由于django的查询方式,不允许使用连续的下划线
​ .定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入 到django.db.models中

​ 使用方式
​ ·导入from django.db import models
​ ·通过models.Field创建字段类型的对象,赋值给属性
​ 逻辑删除
​ 对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False

属性参考连接: https://www.cnblogs.com/PythonHomePage/p/7634390.html

属性参考连接: https://blog.csdn.net/dreamingcrazy/article/details/82693184

​ 常用字段类型:

	·AutoField
	一个根据实际ID自动增长的IntegerField,通常不指定如果不指定,一个主键字段将自动添加到模型中
		
	·CharField(max_length=字符长度)
	字符串,默认的表单样式是 TextInput

	·TextField
	大文本字段,一般超过4000使用,默认的表单控件是Textarea

	·IntegerField
	整数

	·DecimalField(max_digits=None, decimal_places=None)
	使用python的Decimal实例表示的十进制浮点数
	参数说明
			max_digits 位数总数
			decimal_places 小数点后的数字位数

	·FloatField
		用Python的float实例来表示的浮点数

	·BooleanField
		true/false 字段,此字段的默认表单控制是CheckboxInput

	·NullBooleanField
		支持null、true、false三种值

	·DateField([auto_now=False, auto_now_add=False])
		使用Python的datetime.date实例表示的日期
		参数说明
		auto_now
		每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为		false
		auto_now_add
		当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
        
		注意
		auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果

	·TimeField
		使用Python的datetime.time实例表示的时间,参数同DateField

	·DateTimeField
		使用Python的datetime.datetime实例表示的日期和时间,参数同DateField

	·FileField
		一个上传文件的字段

	·ImageField
		继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image

​ 常用字段选项(通过字段选项,可以实现对字段的约束):

    1、 null=True
	   数据库中字段是否可以为空
	2、 blank=True
	   django的 Admin 中添加数据时是否可允许空值
	    #一般null=True & blank=True 咱们搭配着用,出现null=True就用上blank=True
	3、 primary_key = True
	   主键,对AutoField设置主键后,就会代替原来的自增 id 列
	4、 auto_now 和 auto_now_add
	   auto_now   自动创建---无论添加或修改,都是当前操作的时间
	   auto_now_add  自动创建---永远是创建时的时间
	5、 choices  (后台admin下拉菜单)
	     USER_TYPE_LIST = (
	         (1,u'超级用户'),
	         (2,u'普通用户'),
	     )
	     user_type = 					models.IntegerField(choices=USER_TYPE_LIST,default=1,verbose_name=u'用户类型')
	6、 max_length 最大长度
	7、 default  默认值
	8、 verbose_name  Admin(后台显示的名称)中字段的显示名称
	9、 name|db_column  数据库中的字段名称
	10、unique=True  不允许重复
	11、db_index = True  数据库索引,例如:如果你想通过name查询的更快的话,给他设置为索引即可
	12、editable=True  在Admin里是否可编辑
	13、error_messages=None  错误提示
	14、help_text  在Admin中提示帮助信息
	15、validators=[] 自定义验证器
	16、upload-to      指定上传路径

models

​ 一般的数据库操作流程:
​ 创建数据库,设计表结构和字段
​ 使用 MySQLdb 来连接数据库,并编写数据访问层代码
​ 业务逻辑层去调用数据访问层执行数据库操作
​ 比如如下代码:
​ import MySQLdb

	def GetList(sql):
	    db = MySQLdb.connect(user='root', db='test', passwd='1234', host='localhost')
	    cursor = db.cursor()
	    cursor.execute(sql)
	    data = cursor.fetchall()
	    db.close()
	    return data
	 
	def GetSingle(sql):
	    db = MySQLdb.connect(user='root', db='test', passwd='1234', host='localhost')
	    cursor = db.cursor()
	    cursor.execute(sql)
	    data = cursor.fetchone()
	    db.close()
	    return data
Django通过Model操作数据库,不管你数据库的类型是MySql或者Sqlite,Django自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要会写Model就可以了。
django使用关系对象映射(Object Relational Mapping,简称ORM)框架去操控数据库。
ORM(Object Relational Mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
可以简单理解为翻译机。
django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。
对于ORM框架里:
	我们写的类表示数据库的表
	如果根据这个类创建的对象是数据库表里的一行数据
	对象.id 对象.value 是每一行里的数据 
models基本操作
	增:
		1)创建对象实例,然后调用save方法:
			obj = models.Tb1(c1='xx', c2='oo') 
			obj.save()
		2)使用create方法
			models.Tb1.objects.create(c1='xx', c2='oo')
	删:
		使用queryset的delete方法:
		models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据
		models.Tb1.objects.all().delete() # 删除指定条件的数据
		objects不能直接调用delete方法。
		使用模型对象的delete方法:
		b = Blog.objects.get(pk=1)
		b.delete()
	改:
		models.Tb1.objects.filter(name='seven').update(gender='0')
		注意改会更新所有字段。
		模型没有定义update方法,直接给字段赋值,并调用save,能实现update的功能,比如:
		>>> product = Product.objects.get(name='Venezuelan Beaver Cheese')
		>>> product.number_sold += 1
		>>> product.save()
		同样会更新所有字段,如果只想更新某个字段,减少数据库操作,可以这么做:
		product.name = 'Name changed again'
		product.save(update_fields=['name'])
	查:
		获取单条数据:models.Tb1.objects.get(id=123)
			get():返回一个满足条件的对象
	      如果没有找到符合条件的对象,会引发 模型类.DoesNotExist异常
	      如果找到多个,会引发  模型类.MultipleObjectsReturned 异常
		  first():返回查询集中的第一个对象
		  last():返回查询集中的最后一个对象
		  count():返回当前查询集中的对象个数
		  exists():判断查询集中是否有数据,如果有数据返回True没有反之
		models.Tb1.objects.all()               # 获取全部
		models.Tb1.objects.filter(name='seven') # 获取指定条件的数据
		models.UserInfo.objects.all().values('password')#获取指定列的值,可以传多个参数!返回列表。
	进阶操作:
		# 获取个数
		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的值
		# models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id在11、22、33中的数据
		models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
		models.Tb1.objects.filter(name__contains="ven")# contains(和数据中like语法相同)
		models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
		models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and
		startswith,istartswith, endswith, iendswith,  #以什么开始,以什么结束,和上面一样带i的是大小写不敏感的
		models.Tb1.objects.filter(name='seven').order_by('id')    # asc正序
		models.Tb1.objects.filter(name='seven').order_by('-id')   # desc反序
		models.Tb1.objects.all()[10:20]  #取所有数据的10条到20条,分页的时候用的到
		使用aggregate()函数返回聚合函数的值
		Avg:平均值
		Count:数量
		Max:最大
		Min:最小
		Sum:求和
		
		Student.objects().all().aggregate(Max('age'))
		# 注解
		from django.db.models import Count, Min, Max, Sum
		pubs = Publisher.objects.annotate(num_books=Count('book'))
		pubs[0].num_books


mysqldb

import MySQLdb

基本操作:

def GetList(sql):
db = MySQLdb.connect(user=‘root’, db=‘mydb’, passwd=‘123’, host=‘localhost’)
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchall()
db.close()
return data

def GetSingle(sql):
db = MySQLdb.connect(user=‘root’, db=‘mydb’, passwd=‘123’, host=‘localhost’)
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchone()
db.close()
return data

关于pymysql

pymysql是Python中操作数据库MySQL的模块。

在Python3.x以后,由于Python统一了数据库连接的接口,开始使用pymysql, pymysql 和 MySQLdb 在使用方式上是类似的,因此,python3.x链接mysql数据库应安装Python,使用pip安装方法是:

1.安装pymysql

运行(win+R)——输入cmd——在黑窗口输入 pip3 install pymysql——安装成功

名词解释

pymysql.Connect() 参数说明
host(str): MySQL服务器地址
port(int): MySQL服务器端口号
user(str): 用户名
passwd(str): 密码
db(str): 数据库名称
charset(str): 连接编码

connection 对象支持的方法
cursor() 使用该连接创建并返回游标
commit() 提交当前事务
rollback() 回滚当前事务
close() 关闭连接

cursor对象支持的方法
execute(op) 执行一个数据库的查询命令
fetchone() 取得结果集的下一行
fetchmany(size) 获取结果集的下几行
fetchall() 获取结果集中的所有行
rowcount() 返回数据条数或影响行数

close() 关闭游标对象

标签:name,Python,Tb1,db,cursor,models,objects,基本操作
来源: https://blog.csdn.net/weixin_45414731/article/details/100735127

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有