ORM概念:

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象(

1. 不同的程序员写的SQL水平参差不齐
2. 执行效率也参差不齐

)的技术。

ORM 能够把 python语句 自动的翻译 为SQL语句

ORM优点: 

  1. 简单,不用自己写SQL语句
  2. 开发效率高

  缺点:

  执行效率有差距 

ORM的对应关系:

  类 ---> 数据表
  对象 ---> 数据行
  属性 ---> 字段

ORM能做的事儿:
  1. 操作数据表 --> 创建表/删除表/修改表
      操作models.py里面的类

  2. 操作数据行 --> 数据的增删改查

  不能创建数据库,自己动手创建数据库

使用Django的ORM详细步骤:
1. 自己动手创建数据库
  create database 数据库名;
2. 在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库)
  # 数据库相关的配置
  DATABASES = {
  'default': {
  'ENGINE': 'django.db.backends.mysql', # 连接的数据库类型
  'HOST': '127.0.0.1', # 连接数据库的地址
  'PORT': 3306, # 端口
  'NAME': "day61", # 数据库名称
  'USER': 'root', # 用户
  'PASSWORD': '123456' # 密码
  }
  }

3. 告诉Django用pymysql代替默认的MySQLDB 连接MySQL数据库
  在项目/__init__.py文件中,写下面两句:
  import pymysql
  # 告诉Django用pymysql来代替默认的MySQLdb
  pymysql.install_as_MySQLdb()

4. 在app/models.py里面定义类
# 出版社
class Publisher(models.Model):
id = models.AutoField(primary_key=True) # 自增的ID主键
# 创建一个varchar(64)的唯一的不为空的字段
name = models.CharField(max_length=64, null=False, unique=True)

5. 执行两个命令
1. python3 manage.py makemigrations --> 把models.py里面的更改记录到小本本上
2. python3 manage.py migrate --> 把更改翻译成SQL语句,去数据库执行

Django ORM常用字段:
  1. AutoField --> 自增
  2. CharField --> varchar(xx)
  3. ForeignKey --> 外键

    ForeignKey 字段的参数;

    a.to  --> 设置要关联的表;

    b.to_field -->设置要关联的表的字段

    c.related_name -->  反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。
  4. ManyToManyField --> 多对多关联

  5. DateField  -->日期字段,日期格式  YYYY-MM-DD 
  6. DateTimeField --> 日期时间字段,格式 YYYY-MM-DD HH:MM

  7. IntegerField -->整数类型

字段的合集:

AutoField(Field)- int自增列,必须填入参数 primary_key=TrueBigAutoField(AutoField)- bigint自增列,必须填入参数 primary_key=True注:当model中如果没有自增列,则自动会创建一个列名为id的列from django.db import modelsclass 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 ~ 32767PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正小整数 0 ~ 32767IntegerField(Field)- 整数列(有符号的) -2147483648 ~ 2147483647PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正整数 0 ~ 2147483647BigIntegerField(IntegerField):- 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807BooleanField(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中提供验证 URLSlugField(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.FileSystemStorageImageField(FileField)- 字符串,路径保存在数据库,文件上传到指定目录- 参数:upload_to = ""      上传文件的保存路径storage = None      存储组件,默认django.core.files.storage.FileSystemStoragewidth_field=None,   上传图片的高度保存的数据库字段名(字符串)height_field=None   上传图片的宽度保存的数据库字段名(字符串)DateTimeField(DateField)- 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]DateField(DateTimeCheckMixin, Field)- 日期格式      YYYY-MM-DDTimeField(DateTimeCheckMixin, Field)- 时间格式      HH:MM[:ss[.uuuuuu]]DurationField(Field)- 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型FloatField(Field)- 浮点型DecimalField(Field)- 10进制小数- 参数:max_digits,小数总长度decimal_places,小数位长度BinaryField(Field)- 二进制类型字段合集

 

在ORM 表单中没有char字段;需要自定义

#自定义char字段
class FixedCharField(models.Field):"""自定义的char类型的字段类"""def __init__(self, max_length, *args, **kwargs):self.max_length = max_lengthsuper(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)def db_type(self, connection):"""限定生成数据库表的字段类型为char,长度为max_length指定的值"""return 'char(%s)' % self.max_length

class Class(models.Model):id = models.AutoField(primary_key=True)title = models.CharField(max_length=25)# 使用上面自定义的char类型的字段cname = FixedCharField(max_length=25)

  

3. 常用的字段参数
1. null

用于表示某个字段可以为空。
2. default

该字段为默认值
3. unique

如果设置为unique=True 则该字段在此表中必须是唯一的 。
4. db_index
如果db_index=True 则代表着为此字段设置数据库索引。

5. DateField和DateTimeField才有的参数:
auto_now_add=True --> 创建数据的时候自动把当前时间赋值
auto_add=True --> 每次更新数据的时候更新当前时间
上述两个不能同时设置!!!

  

表和表之间的关系
1. 一对多(出版社和书);1对多  ,外键通常设置在多的那一边;
publisher = models.ForeignKey(to="Publisher")
数据库中实际 生成的是一个 publisher_id 字段

2. 多对多(作者和书);多对多,通常设置在正向查询多的那一边;比如我用author 查询 book 比较多,则把外键放在author.
books = models.ManyToManyField(to="Book")

在数据库中:
是通过第三张表建立的关系(默认第三张表名 为字段_另一个多对多的字段)

# 书
class Book(models.Model):id = models.AutoField(primary_key=True)bookname = models.CharField(null=False,max_length=15,unique=True)price = models.DecimalField(max_digits=5,decimal_places=2,default=99.99)kucun = models.IntegerField(default=10000)sell_num = models.IntegerField(default=0)# 书和出版社关联的外键(单表对单表的)# on_delete=models.CASCADE ; 级联删除,即删除主表数据会自动删除从表数据;使关联的数据对应;# related_name 来代替 表名_set;publisher = models.ForeignKey(to="Publisher",default=1,on_delete=models.CASCADE,     related_name='books')     #反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。#在数据库里面生成的字段为 publisher_id 是出版社的id#Book.object.publisher 为该书对应的出版社的对象;def __str__(self):return "Publisher_object:{}".format(self.bookname)#出版社
class Publisher(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(null=False,max_length=15,unique=True)def __str__(self):return "Publisher_object:{}".format(self.name)# class Meta:#    ordering ='id'# 书和出版社是,1对1的(ForeignKey(to=)),是需要添加外键的# 而书和作者是多对多的,一本书可以有多个作者,还有一个作者也可能有多本书,即多对多的时候用(ManyToManyField(to=))
#然后ROM会自动的帮你生成另外的一张表来表示多对多的关系,这个列子生产的另外一个表为author_book;
# 作者
class Author(models.Model):id = models.AutoField(primary_key=True)author_name = models.CharField(null=False, max_length=15)#多对多的book = models.ManyToManyField(to="Book")def __str__(self):return "Publisher_object:{}".format(self.author_name)

 详细参考(点我) 

3. 一对一  ;比如作者和作者详情,一个作者只能对于自己的作者详情;

1. 什么时候用一对一?
  当 一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁
  把不怎么常用的字段 单独拿出来做成一张表 然后用过一对一关联起来
2. 优势
  既保证数据都完整的保存下来,又能保证大部分的检索更
3. ORM中的用法
  OneToOneField(to="")

举例:作者和作者详情是一对一的;跟一对多,用法相同,只不过detail里面的不能重复;在数据库中也是多一个detail_id 字段

总结+练习ORM(多表的查询)

   # #####################基于对象查询(子查询)###############################                按字段(publish)# 一对多   book  ----------------->  publish#               <----------------#                 book_set.all()# 正向查询按字段:# 查询python这本书籍的出版社的邮箱# python=models.Book.objects.filter(title="python").first()# print(python.publish.email)# 反向查询按     表名小写_set.all()# 苹果出版社出版的书籍名称# publish_obj=models.Publish.objects.filter(name="苹果出版社").first()# for obj in publish_obj.book_set.all():#     print(obj.title)#                按字段(authors.all())# 多对多   book  ----------------------->  author#               <----------------#                  book_set.all()# 查询python作者的年龄# python = models.Book.objects.filter(title="python").first()# for author in python.authors.all():#     print(author.name ,author.age)# 查询alex出版过的书籍名称# alex=models.Author.objects.filter(name="alex").first()# for book in alex.book_set.all():#     print(book.title)#                  按字段 authorDetail# 一对一  author  ----------------------->  authordetail#                <----------------#                  按表名  author# 查询alex的手机号# alex=models.Author.objects.filter(name='alex').first()# print(alex.authorDetail.telephone)# 查询家在山东的作者名字# ad_list=models.AuthorDetail.objects.filter(addr="shandong")## for ad in ad_list:#     print(ad.author.name)'''对应sql:select publish_id from Book where title="python"select email from Publish where nid =   1'''# #####################基于queryset和__查询(join查询)############################# 正向查询:按字段  反向查询:表名小写# 查询python这本书籍的出版社的邮箱# ret=models.Book.objects.filter(title="python").values("publish__email")# print(ret.query)'''select publish.email from Book left join Publish on book.publish_id=publish.nid where book.title="python"'''# 苹果出版社出版的书籍名称# 方式1:# ret1 = models.Publish.objects.filter(name="苹果出版社").values("book__title")# print("111111111====>", ret1.query)# # 方式2:# ret2 = models.Book.objects.filter(publish__name="苹果出版社").values("title")# print("2222222222====>", ret2.query)## # 查询alex的手机号# # 方式1:# ret = models.Author.objects.filter(name="alex").values("authorDetail__telephone")## # 方式2:# models.AuthorDetail.objects.filter(author__name="alex").values("telephone")# 查询手机号以151开头的作者出版过的书籍名称以及书籍对应的出版社名称 ; 跨5张表; 都联合起来;ret = models.Book.objects.filter(authors__authorDetail__telephone__startswith="151").values('title', "publish__name")print(ret)

  

# 作者
class Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()phone = models.IntegerField()books = models.ManyToManyField(to="Book", related_name="authors")detail = models.OneToOneField(to="AuthorDetail")def __str__(self):return self.name# 作者详情
class AuthorDetail(models.Model):# 爱好hobby = models.CharField(max_length=32)# 地址addr = models.CharField(max_length=128)  

转载于:https://www.cnblogs.com/zenghui-python/p/10800176.html

Django基础——ORM字段和字段参数相关推荐

  1. Django 数据库ORM 操作 - 字段的类型和参数

    通过Django的ORM创建表的时候,我们需要定义自己的类. 定义类的时候,他有各种各样的字段类型,每个字段都有自己的参数可以进行配置,下面简单的归纳一下. 首先看看字段的类型.尽管Python提供了 ...

  2. Django之ORM字段和参数

    字段 常用字段 AutoField 自增int自增列,必须填入参数 primary_key=True. 当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整 ...

  3. Django - ORM字段和字段参数

    目录 Django - ORM字段和字段参数 一. Django中的ORM 1. Django项目使用MySQL数据库 2.Model 3.基本用法 Django ORM 常用字段和参数 常用字段 其 ...

  4. Django中ORM常用字段类型及参数

    常用字段: <1> CharField 字符串字段, 用于较短的字符串. CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的 ...

  5. django的orm指定字段名,表名 verbose_name_plural

    django的orm指定字段名,表名 verbose_name_plural 1.指定字段名: 在定义字段的时候,增加参数db_column='real_field': 2.指定表名: 在model的 ...

  6. Django创建mysql数据库常用字段及参数

    原文衔接:https://www.cnblogs.com/yanjiayi098-001/p/11733938.html Django创建mysql数据库常用字段及参数 常用字段 1.models.A ...

  7. django 模板mysql_59 Django基础三件套 , 模板{{}}语言 , 程序连mysql Django项目app Django中ORM的使用...

    主要内容:https://www.cnblogs.com/liwenzhou/p/8688919.html 1 form表单中提交数据的三要素 a : form标签必须要有action和method的 ...

  8. 字段和字段的参数,查询的13个方法,但标的双下划线外键和多对多操作

    字段 常用字段  AutoField() 自增列,必须填入参数 primary_key=True则成为数据库的主键.无该字段时,django自动创建 一个model不能有两个AutoField字段. ...

  9. django中Models常用的字段及属性介绍

    模型类 介绍 每个模型类都可以被映射为数据库中的一个数据表,类类属性被映射为数据字段,除此之外,数据库表的主键.外键.约束等也通过类属性完成定义 模型类属性 属性 描述 AutoField AutoF ...

最新文章

  1. “僵尸病毒”入侵全球电脑,7.5万部电脑中招(来源:广州日报)
  2. 矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法 | ICML 2021
  3. 如果你不曾失败,只因你从未尝试
  4. Python1217作业
  5. python取百位数个位数_使用Python把数值形式的金额变成人类可读形式
  6. Solr分页与高亮(使用SolrNet实现)
  7. 北邮OJ 980. 16校赛-R_clover's Challenge
  8. 字体单独设置样式_Glyphs 官方教程 | 字体命名
  9. 写文章最难写的是标题
  10. python中range 函数_pythonrange,range函数的用法
  11. Makefile模板的改进
  12. 如何编写一份优质的可行性研究报告
  13. 干货:react新手入门之react小书
  14. 2021机器学习面试必考100题最新汇总(附答案详解)
  15. 围观了字节跳动张一鸣近 10 年的微博,有人整理了这 231 条干货关键词:延迟满足感,自控,理性,反省,创新,学习。...
  16. uva 10099【The Tourist Guide】
  17. 微信早安推送,26都要骗,笑死了
  18. insert注入:SQL之insert注入
  19. 「微服务架构」亚马逊引领其自有微服务架构的原因
  20. 4.1 Web前端开发介绍

热门文章

  1. Xmanager连接Linux桌面异常解决方案
  2. JavaScript中的原型,对split方法的重写
  3. Python命令行选项参数解析策略
  4. Java/Android中实现Shell命令
  5. linux 安装 加入内核参数,Linux 实现自动安装服务组件以及优化内核参数
  6. mfc调取摄像头显示并截图_前摄后录,让行车安全再次提升:70迈智能后视镜后摄像头体验...
  7. 三星E1200R语言设置_三星 S20 系列评测:依旧是 Android 阵营最高水平
  8. 现代微波滤波器结构与设计_高功率射频及微波无源器件中的考虑和限制
  9. 华为设备不会配置静态路由怎么办?
  10. OpenKruise 如何实现应用的可用性防护?