分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

WEB框架Django之ORM操作

发布时间:2023-09-06 02:05责任编辑:苏小强关键词:暂无标签

一 ORM的简介

MVC或者MVC框架中包括的一个重要部分就是ORM,它实现了数据模型与数据库的解耦。
即数据模型的设计不需要依赖于特定的数据库,通过简单的配置可以轻松更换数据库,这可以大大减少开发人员的工作量

二 数据库的设置

若想要将模型转为mysql的表,需要在settings中配置:

 1 DATABASES = { 2 ????????????‘default‘:{ 3 ????????????????‘ENGINE‘:‘django.db.backends.mysql‘, 4 ????????????????‘NAME‘:‘bms‘ ???????????????# 要连接的数据库,连接前要创建好 5 ????????????????‘USER‘:‘root‘ ???????????????# 连接数据库的用户名 6 ????????????????‘PASSWORD‘:‘‘, ???????????????# 连接数据库的密码 7 ????????????????‘HOST‘:"127.0.0.1", ???????????# 连接主机的IP 8 ????????????????‘PORT‘:3306 ???????????????????# 数据库端口号 9 ????????????????}10 ???????????}

注意点1

    NAME即数据库的名字,在mysql连接前该数据库必须已经建立,而上面的sqlite数据库下的db.sqlite3则是项目自动创建USER和PASSWORD,分别是数据库的用户名和密码。设置完成,在启动Django项目前,需要先激活mysql。然后,项目启动会报错:no module named MySQLdb。
   这是因为django默认你导入的驱动是MySQLdb,可是MYSQLdb对于py3有很大问题,所以我们需要驱动PyMySQL,所以,我们只需要在项目名文件下的__init__.py里面写入:

impor pymysqlpymysql.install_as_MYSQLdb()最后通过两条数据库迁移命令在指定的数据库表中创建表:python manage.py makemigrationspython manage.py migrate

注意点2
    要确保配置文件中的INSTALLED_APPS中写入我们创建的app名称

注意点3
    如果想打印orm转换sql的过程,需要在settings进行如下配置

LOGGING = { ???????‘version‘:1, ???????‘disable_existing_loggers‘:False, ???????‘handlers‘:{ ???????????‘console‘:{ ???????????????‘level‘:‘DEBUG‘ ???????????????????????????????????????‘class‘:‘loggin.StreamHandler‘, ???????????????????}, ???????????????}, ???????‘loggers‘:{ ???????????????‘django.db.backends‘:{ ???????????????‘handlers‘:[‘console‘] ???????????????‘propagate‘:True, ???????????????‘level‘:‘DEBUG‘, ???????????????????}, ???????????????}, ???????????} ???????????

三 表的创建以及单表操作 

1 创建一张表

首先要在app中的moudels.py中创建表
代码:

from django.db import models ???????????class Book(models.Model): ???id = models.AutoFiled(primary_key=True) ???title = models.CharField(max_length=32) ???state = models.BooleanFiled() ???pub_date = models.DateField() ???price = models.DecimalFiled(max_digits=8,decimal_places=2) ???publish = models.CharField(max_legth=32)

modles方法创建表的主要字段:

 ?AutoField(Field) ???????- int自增列,必须填入参数 primary_key=True ???BigAutoField(AutoField) ???????- bigint自增列,必须填入参数 primary_key=True ???????注:当model中如果没有自增列,则自动会创建一个列名为id的列 ???????from django.db import models ???????class UserInfo(models.Model): ???????????# 自动创建一个列名为id的且为自增的整数列 ???????????username = models.CharField(max_length=32) ???????class Group(models.Model): ???????????# 自定义自增列 ???????????nid = models.AutoField(primary_key=True) ???????????name = models.CharField(max_length=32) ???SmallIntegerField(IntegerField): ???????- 小整数 -32768 ~ 32767 ???PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) ???????- 正小整数 0 ~ 32767 ???IntegerField(Field) ???????- 整数列(有符号的) -2147483648 ~ 2147483647 ???PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) ???????- 正整数 0 ~ 2147483647 ???BigIntegerField(IntegerField): ???????- 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 ???BooleanField(Field) ???????- 布尔值类型 ???NullBooleanField(Field): ???????- 可以为空的布尔值 ???CharField(Field) ???????- 字符类型 ???????- 必须提供max_length参数, max_length表示字符长度 ???TextField(Field) ???????- 文本类型 ???EmailField(CharField): ???????- 字符串类型,Django Admin以及ModelForm中提供验证机制 ???IPAddressField(Field) ???????- 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 ???GenericIPAddressField(Field) ???????- 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 ???????- 参数: ???????????protocol,用于指定Ipv4或Ipv6, ‘both‘,"ipv4","ipv6" ???????????unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both" ???URLField(CharField) ???????- 字符串类型,Django Admin以及ModelForm中提供验证 URL ???SlugField(CharField) ???????- 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) ???CommaSeparatedIntegerField(CharField) ???????- 字符串类型,格式必须为逗号分割的数字 ???UUIDField(Field) ???????- 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 ???FilePathField(Field) ???????- 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 ???????- 参数: ???????????????path, ?????????????????????文件夹路径 ???????????????match=None, ???????????????正则匹配 ???????????????recursive=False, ??????????递归下面的文件夹 ???????????????allow_files=True, ?????????允许文件 ???????????????allow_folders=False, ??????允许文件夹 ???FileField(Field) ???????- 字符串,路径保存在数据库,文件上传到指定目录 ???????- 参数: ???????????upload_to = "" ?????上传文件的保存路径 ???????????storage = None ?????存储组件,默认django.core.files.storage.FileSystemStorage ???ImageField(FileField) ???????- 字符串,路径保存在数据库,文件上传到指定目录 ???????- 参数: ???????????upload_to = "" ?????上传文件的保存路径 ???????????storage = None ?????存储组件,默认django.core.files.storage.FileSystemStorage ???????????width_field=None, ??上传图片的高度保存的数据库字段名(字符串) ???????????height_field=None ??上传图片的宽度保存的数据库字段名(字符串) ???DateTimeField(DateField) ???????- 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] ???DateField(DateTimeCheckMixin, Field) ???????- 日期格式 ?????YYYY-MM-DD ???TimeField(DateTimeCheckMixin, Field) ???????- 时间格式 ?????HH:MM[:ss[.uuuuuu]] ???DurationField(Field) ???????- 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 ???FloatField(Field) ???????- 浮点型 ???DecimalField(Field) ???????- 10进制小数 ???????- 参数: ???????????max_digits,小数总长度 ???????????decimal_places,小数位长度 ???BinaryField(Field) ???????- 二进制类型
models字段

modles方法字段参数

 ???null ???????????????数据库中字段是否可以为空 ???db_column ??????????数据库中字段的列名 ???default ????????????数据库中字段的默认值 ???primary_key ????????数据库中字段是否为主键 ???db_index ???????????数据库中字段是否可以建立索引 ???unique ?????????????数据库中字段是否可以建立唯一索引 ???unique_for_date ????数据库中字段【日期】部分是否可以建立唯一索引 ???unique_for_month ???数据库中字段【月】部分是否可以建立唯一索引 ???unique_for_year ????数据库中字段【年】部分是否可以建立唯一索引 ???verbose_name ???????Admin中显示的字段名称 ???blank ??????????????Admin中是否允许用户输入为空 ???editable ???????????Admin中是否可以编辑 ???help_text ??????????Admin中该字段的提示信息 ???choices ????????????Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 ???????????????????????如:gf = models.IntegerField(choices=[(0, ‘何穗‘),(1, ‘大表姐‘),],default=1) ???error_messages ?????自定义错误信息(字典类型),从而定制想要显示的错误信息; ???????????????????????字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date ???????????????????????如:{‘null‘: "不能为空.", ‘invalid‘: ‘格式错误‘} ???validators ?????????自定义错误验证(列表类型),从而定制想要的验证规则 ???????????????????????from django.core.validators import RegexValidator ???????????????????????from django.core.validators import EmailValidator,URLValidator,DecimalValidator, ???????????????????????MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator ???????????????????????如: ???????????????????????????test = models.CharField( ???????????????????????????????max_length=32, ???????????????????????????????error_messages={ ???????????????????????????????????‘c1‘: ‘优先错信息1‘, ???????????????????????????????????‘c2‘: ‘优先错信息2‘, ???????????????????????????????????‘c3‘: ‘优先错信息3‘, ???????????????????????????????}, ???????????????????????????????validators=[ ???????????????????????????????????RegexValidator(regex=‘root_\d+‘, message=‘错误了‘, code=‘c1‘), ???????????????????????????????????RegexValidator(regex=‘root_112233\d+‘, message=‘又错误了‘, code=‘c2‘), ???????????????????????????????????EmailValidator(message=‘又错误了‘, code=‘c3‘), ] ???????????????????????????)
字段参数

元信息

class UserInfo(models.Model): ???????nid = models.AutoField(primary_key=True) ???????username = models.CharField(max_length=32) ???????class Meta: ???????????# 数据库中生成的表名称 默认 app名称 + 下划线 + 类名 ???????????db_table = "table_name" ???????????# 联合索引 ???????????index_together = [ ???????????????("pub_date", "deadline"), ???????????] ???????????# 联合唯一索引 ???????????unique_together = (("driver", "restaurant"),) ???????????# admin中显示的表名称 ???????????verbose_name ???????????# verbose_name加s ???????????verbose_name_plural

2 添加表记录的方法

方式一

    # create方法的返回值book_obj就是插入表中的python红宝石这个本书记录对象
    book_Obj = Book.objects.create(title="python红宝石", state=True, price=100, publish="人民出版社", pub_date="2012-12-12")


方式二

    book_obj = Book(title="python红宝石", state=True, price=100, publish="人民出版社", pub_date="2012-12-12")
    book_Obj.save()

3 表查询的方法

查询API:

  

<1> all() ???????????????????????查询所有结果,返回一个queryset对象<2> filter(**kwargs) ????????????它包含了与所给予的筛选条件相匹配的对象<3> get(**kwargs) ???????????????返回与筛选条件相匹配的对象,返回结果只有一个。如果筛选条件的对象超过一个或者没有会抛出异常<4> exclude(**kwargs) ???????????包含了与所筛选条件不匹配的对象<5> order_by(*field) ????????????对查询结果排序<6> reverse() ???????????????????对查询结果反向排序<7> count() ?????????????????????返回数据库中匹配查询(QuerySet)的对象数量<8> first() ?????????????????????返回第一条记录<9> last() ??????????????????????返回最后一条记录<10> exists() ???????????????????如果QuerySet包含数据就返回True,否则返回False<11> values(*field) ?????????????返回一个ValueQuerySet,一个特殊的QuerSet,运行后得到的并不是一系列model实例化对象,而是一个可迭代的字典序序列<12> values_list(*filed) ????????它与values()非常相似,它返回的是一个元祖序列,values返回的是一个字典序列。<13> distinct() ?????????????????从返回结果中剔除重复记录

基于双下划线的模糊查询:

Book.object.filter(price__in=[100,200,300])Book.object.filter(price__get=100)Book.object.filter(price__lt=100)Book.object.filter(price__range=[100,200])Book.object.filter(title__contains="python") ??# 筛选包含python这个字符串的内容 ???Book.object.filter(title__iontains="python") ??# 筛选包含python这个字符串的内容,但是不区分大小写Book.object.filter(title__startswitch="py")Book.object.filter(pub__date__year=2012)Book.object.filter(pub__date__isnull=true) ????# 获取为空的对象Book.object.filter(timestamp__hour=23)Book.object.filter(time__hour=5)Book.object.filter(timestamp__hour__gte=12)Book.objects.get(title__regexr‘^(An?|The)+‘) ?# 使用正则匹配 ???Book.objects.get(title__iregexr‘^(An?|The)+‘) # 使用正则匹配不区分大小写

3 删除表记录

删除方式就是delete(),它运行时立即删除对象而不返回任何值。例如
    model_obj.delete()
你也可以一次删除多个对象,每个QuerrySet都有一个delete()方法,它一次性删除QuerrySet中所有的对象。例如 下面代码将删除pub_date是2005年的Entry对象:
   Entry.objects.filter(pub__date__year=2005).delete()
在Django删除对象时,会模仿SQL约束ON DELETE CASCADE的行为,删除一个对象时也会删除与它相关的外键对象。例如:
    b = Blog.objecs.get(pk=1)
    b.delete()
要注意的是:delete()方法是QuerrySet上的方法,但并不适用与Manager本身。这是一种保护机制,为了避免意外的调用Entry.objects.delete()方法导致所有的记录被误删。如果确认要删除索引的对象,那么必须显式调用Entry.objects.all().delete()
如果不想级联删除,可以设置为pubHouse = models.ForeignKey(to=‘Publisher‘, on_delete=models.SET_NULL, blank=True, null=True)

WEB框架Django之ORM操作

原文地址:https://www.cnblogs.com/harryblog/p/9346061.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved