Django中ORM模型的总结

模型类的对应关系

多对多

创建模型类----->新闻类型类

class TypeInfo(models.Model):
    	"""创建新闻模型类"""
    	tname = models.CharField(max_length=20)

创建模型类----->新闻内容类

class NewInfo(models.Model):
    	"""闯将新闻内容类"""
   	ntitle = models.CharField(max_length=20)
    	npub_date = models.DateTimeField(auto_now_add=True)
    	ncontent = models.FileField()
    	# 建立多对多的关系
    	ntype = models.ManyToManyField("TypeInfo")

总结:

  1. 建立多对多的语句写在哪一行都可以
  2. 生成第三张表的表名为:(模型类名小写_关联属性名)
  3. 建立的语句写在了哪个模型类当中,决定生成第三张表名的名字
  4. 模型类名小写为:建立语句所在的模型类的类名的小写

更新语句

Models.objects.fileter().update(**info)  # 返回更新的条数
Models.objects.all().update(**info)

删除语句

Models.objects.fileter(条件).delete()  # 返回删除信息

  

一对多

总结(一)当中图书和英雄的案例则为一对多的关系
创建语句写在多的模型类当中

hbook = models.ForeignKey("BookInfo")

总结:

  创建表后关联字段名称为----关联属性_id

一对一

class Student(models.Model):
     """建立学生基本信息模型类"""
     sname = models.CharField(max_length=20)
     sage = models.IntegerField()  
class StuInfo(models.Model):
   	"""简历学生的详细信息类一对一的关系"""
    	scontent = models.CharField(max_length=200)
    	stu = models.OneToOneField("Student")

总结:

  创建语句写在哪一个模型类当中都可以

自关联

描述:

自关联是一种特殊的一对多的关系。
例:显示广州市的上级地区和下级地区。
地区表:id, title, parent

class AreaInfo(models.Model):
    """创建地区模型类"""
    atitle = models.CharField(max_length=20)
    aparent = models.ForeignKey("self", null=True, blank=True)

导入数据信息
注意:导入数据时需要从areas.sql的当前所在文件夹进入数据库
mysql终端中批量执行sql语句:

source areas.sql;

案例:

def area(request):
    """地区示例"""
    # 1.获取当前那的地区
    # 2.id为440100的市为哪个省的
    # 3.id为440100的市里面有那些区
    area = AreaInfo.objects.get(id=440100)
    方法一:
    parent = area.aparent
    children = area.areainfo_set.all()
    方法二:
    parent = AreaInfo.objects.filter(areainfo__id=440100)
    children = AreaInfo.objects.filter(aparent__id=440100)
    return render(request, "booktest/area.html", {"area": area, "parent": parent, "children": children})

模型管理器:

BookInfo.objects.all()->objects是一个什么东西呢?
答:objects是Django帮我自动生成的管理器,通过这个管理器可以实现对数据的查询。
objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。

自定义模型管理器:

  1. 自定义一个管理器类,这个类继承models.Manger类。
  2. 再在具体的模型类里定义一个自定义管理器类的对象

自定义管理器类的应用场景:

  1. 改变查询的结果集。比如调用BookInfo.books.all()返回的是没有删除的图书的数据。
  2. 添加额外的方法。如下:

    管理器类中定义一个方法帮我们创建对应的模型类对象。
    使用self.model()就可以创建一个跟自定义管理器对应的模型类对象。

例:

class BookInfoManage(models.Manager):
  	"""继承模型管理器类"""

    def all(self):
      	# 调用父类的__init__方法1(python2)
       	# Cat.__init__(self,name)
       	# 调用父类的__init__方法2
       	# super(Bosi,self).__init__(name)
       	# 调用父类的__init__方法3---->此方法为python3的方法
       	# super().__init__(name)
       	# books = models.Manager.all(self)
       	# books = super(models.Manager, self).all()
       	# books = super().all(self)
       	books = super(models.Manager, self).all()
       	books = books.filter(isDelete=0)
       	return books
     def create_book(self, btitle, bpub_date):
        """自定义添加数据的方法"""
       	b = BookInfo()
       	# 方法二:此方法的优点,当模型的类名修改时不需要随之修改名字
        # b = self.model()
        b.btitle = btitle
        b.bpub_date = bpub_date
        b.bread = 0
        b.bcomment = 0
        b.save()

自定义模型管理器的好处

  1. 可以更改父类的方法
  2. 根据自己的需求定义额外的对表的一些操作

元选项

django默认生成的表名为  应用的名字_模型类的类名可以通过元选项的操作给表指定表名

需要在模型类中定义一个元类Meta,在里面定义一个类属性db_table就可以指定表名。
例:

class Meta():
    """自定一表名"""
    db_table = "bookinfo"
    # 注意是定义在模型类的里面

查询集:

  1. 查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,
  2. 查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,
  3. 查询集和select语句等价,过滤器像where和limit子句。

返回查询集的过滤器如下:

  • all(): 返回所有数据。
  • filter(): 返回满足条件的数据。
  • exclude(): 返回满足条件之外的数据,相当于sql语句中where部分的not关键字。
  • order_by(): 对结果进行排序。

返回单个值的过滤器如下:

  • get():返回单个满足条件的对象

    •   如果未找到会引发"模型类.DoesNotExist"异常。
    •   如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。
  • count():返回当前查询的总条数
  • aggregate():聚合

查询集的两大特性:

  • 惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
  • 缓存:查询集的结果被存下来之后,再次查询时会使用之前缓存的数据。

限制查询集:

  • 可以通过下标的方式对一个查询集进行切片操作---从而达到限制查询集的的结果

模型类属性

属性命名限制:

  • 不能是python的保留关键字。
  • 不允许使用连续的下划线,这是由django的查询方式决定的,在第4节会详细讲解查询。
  • 定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:

格式:

属性=models.字段类型(选项)

字段类型

使用时需要引入django.db.models包,字段类型如下:

  • AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
  • BooleanField:布尔字段,值为True或False。
  • NullBooleanField:支持Null、True、False三种值。
  • CharField(max_length=字符长度):字符串。TextField:大文本字段,一般超过4000个字符时使用。
    • 参数max_length表示最大字符个数。
  • IntegerField:整数。
  • DecimalField(max_digits=None, decimal_places=None):十进制浮点数。FloatField:浮点数。
    • 参数max_digits表示总位数。
    • 参数decimal_places表示小数位数。
  • DateField[auto_now=False, auto_now_add=False]):日期。TimeField:时间,参数同DateField。
    • 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
    • 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
    • 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
  • DateTimeField:日期时间,参数同DateField。
  • FileField:上传文件字段。
  • ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。
goods_type_id = models.SmallIntegerField(choices=goods_type_choice)

模型类的方法

  • ._meta.get_all_field_names():获取模型类的属性列表(该方法在有些版本没有使用下一个)
  • 模型类._meta.get_fields():获取到的不是一个列表如果需要列表需要自己拼接便利该方法返回结果,每个元素的name属性
  • 模型类.get_full_path():获取访问的全部路径

选项:

  • null:如果为True,表示允许为空,默认值是False。
  • blank:如果为True,则该字段允许为空白,默认值是False。
  • 对比:null是数据库范畴的概念,blank是表单验证证范畴的。
  • db_column:字段的名称,如果未指定,则使用属性的名称。
  • db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
  • default:默认值。
  • primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
  • unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。

抽象模型类

    class Meta():
        abstract = True # 抽象模型类

  

goods_type_id = models.SmallIntegerField(choices=goods_type_choice)

原文地址:https://www.cnblogs.com/lovecong/p/9357348.html

时间: 2024-10-08 21:57:03

Django中ORM模型的总结的相关文章

Django中ORM模型总结(二)[模型类的对应关系,模型类的属性,字段类型]

模型类的对应关系 多对多 创建模型类----->新闻类型类 class TypeInfo(models.Model): """创建新闻模型类""" tname = models.CharField(max_length=20) 创建模型类----->新闻内容类 class NewInfo(models.Model): """闯将新闻内容类""" ntitle = models

django -2 ORM模型

ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是"对象-关系-映射"的简称,主要任务是: 根据对象的类型生成表结构 将对象.列表的操作,转换为sql语句 将sql查询到的结果转换为对象.列表 这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动 Django中的模型包含存储数据的字段和约束,对应着数据库中唯一的表 使用MySql数据库 在虚拟环

Django中ORM介绍和字段及其参数

ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库层之间充当了桥梁的作用. ORM的由来 字母‘O’起源于“对象”(Object),'R'代表“关系”(Relational). 几乎所有的软件开发过程中都会涉及到对象和关系数据库.在用户层面和业务逻辑层

关于Django中ORM数据库迁移的配置

Django中ORM数据库迁移配置 1,若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'bms', # 要连接的数据库,连接前需要创建好 'USER':'root', # 连接数据库的用户名 'PASSWORD':'', # 连接数据库的密码 'HOST':'127.0.0.1', # 连接主机,默认本级 'PORT':3306

Django中ORM字段以及字段参数介绍

一:Django中ORM的介绍 1.ORM的概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库层之间充当了桥梁的作用. 2.ORM的来源 让我们从O/R开始.字母O起源于"对象"(Object),而R则来自于"关系"(Relational)

Django中ORM介绍和字段及字段参数

https://www.cnblogs.com/liwenzhou/p/8688919.html Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库

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

主要内容: 1 form表单中提交数据的三要素 form标签必须要有action和method的属性 所有获取用户输入的标签必须放在form表单里,也必须要有那么name属性.因为往后端提交数据的时候name所对应的是关键字, input输入的值为value.在后端显示为字典的模式, 如果不写name关键字,则取不到值. 必须要有submit按钮. 2 Django 基础三件套 from Django.shortcuts import HttpResponse, render, redirect

Django中ORM介绍

目录 一 ORM介绍 1.1 ORM 概念 1.2 ORM的由来 1.3 ORM的优势 1.4 ORM的劣势 1.5 ORM总结 二 Django中的ORM 2.1 Django使用MySQL数据库 2.2 Model 2.3 快速入门 一 ORM介绍 1.1 ORM 概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动

Django中ORM

Object Relational Mapping(ORM) ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库层之间充当了桥梁的作用. ORM由来 让我们从O/R开始.字母O起源于"对象"(Object),而R则来自于"关系"(Re