当前位置:
首页 > Python基础教程 >
-
Django框架(ORM常用字段和字段参数、关系字段和和字段参数)
12.324 Django ORM常用字段
1.id = models.AutoField(primary_key=True):int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。 2.IntegerField:一个整数类型,范围在 -2147483648 to 2147483647 3.name = models.CharField(max_length=32):varchar字符类型,必须提供max_length参数, max_length表示字符长度 4.title = models.DateField(null=True):日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例 5.title = models.DateTimeField(null=True):日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例 6.TimeField(DateTimeCheckMixin, Field): - 时间格式 HH:MM[:ss[.uuuuuu]] 7.DurationField(Field):- 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 8.TextField(Field): - 文本类型 9.FilePathField(Field): - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数: path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 10.FileField(Field): - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage 11.ImageField(FileField): - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage width_field=None, 上传图片的高度保存的数据库字段名(字符串) height_field=None 上传图片的宽度保存的数据库字段名(字符串) 12.FloatField(Field): - 浮点型 13.DecimalField(Field): - 10进制小数 - 参数:max_digits,总长度 decimal_places,小数位长度 14.BinaryField(Field): - 二进制类型
自定义字段:
自定义char类型字段:
class FixedCharField(models.Field): def __init__(self, max_length, *args, **kwargs): super().__init__(max_length=max_length, *args, **kwargs) self.length = max_length def db_type(self, connection): """ 限定生成数据库表的字段类型为char,长度为length指定的值 """ return 'char(%s)' % self.length class Class(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=25) # 使用上面自定义的char类型的字段 cname = FixedCharField(max_length=25)
自定义无符号的int类型:
class UnsignedIntegerField(models.IntegerField): def db_type(self, connection): return 'integer UNSIGNED' class Class(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=25) # 使用上面自定义的无符号的int类型的字段 cid = UnsignedIntegerField()
12.325 字段参数
title = models.DateField(null=True):用于表示某个字段可以为空 title = models.DateField(unique=True):如果设置为unique=True,则该字段在此表中必须是唯一的 title = models.DateField(db_index=True):如果db_index=True,则代表着为此字段设置数据库索引 price = models.DecimalField(max_digits=5, decimal_places=2, default=9.9):为该字段设置默认值 DatetimeField、DateField、TimeField: publisher_date = models.DateField(auto_now_add): 配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库 publisher_date = models.DateField(auto_now): 配置上auto_now=True,每次更新数据记录的时候会更新该字段
12.326关系字段(ForeignKey)
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
ForeignKey字段参数:
publisher = models.ForeignKey(to='Publisher', tofield='id' on_delete=models.CASCADE, db_constraint=False) 1.to:设置要关联的表 2.to_field:设置要关联的表的字段、 3.related_name:反向操作时,使用的字段名,用于代替原反向查询时的'表名_set' 4.related_query_name:反向查询操作时,使用的连接前缀,用于替换表名 5.on_delete=models.CASCADE:当删除关联表中的数据时,当前表与其关联的行的行为,models.CASCADE删除关联数据,与之关联也删除(1.1版本默认级联删除,2.0版本后必须手动添加) 6.on_delete=models.SET()删除关联数据, a. 与之关联的值设置为指定值,设置:models.SET(值) b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) def func(): return 10 class MyModel(models.Model): user = models.ForeignKey( to="User", to_field="id", on_delete=models.SET(func) ) 7.db_constraint:是否在数据库中设置外键约束关系,默认为True,设置成False,数据库中不体现约束关系,相当于普通字段
示例:
class Classes(models.Model): name = models.CharField(max_length=32) class Student(models.Model): name = models.CharField(max_length=32) theclass = models.ForeignKey(to="Classes")
当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
models.Classes.objects.first().student_set.all()
当我们在ForeignKey字段中添加了参数 related_name 后:
class Student(models.Model): name = models.CharField(max_length=32) theclass = models.ForeignKey(to="Classes", related_name="students")
当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
models.Classes.objects.first().students.all()
12.327OneToOneField
一对一字段:通常一对一字段用来扩展已有字段。
一对一的关联关系多用在当一张表的不同字段查询频次差距过大的情况下,将本可以存储在一张表的字段拆开放置在两张表中,然后将两张表建立一对一的关联关系。
class Author(models.Model): name = models.CharField(max_length=32) gender_choice = ((1, "男"), (2, "女"), (3, "保密")) gender = models.SmallIntegerField(choices=gender_choice, default=3) info = models.OneToOneField(to='AuthorInfo') class AuthorInfo(models.Model): phone = models.CharField(max_length=11) email = models.EmailField(unique=True, db_index=True) 1.to:设置要关联的表 2.to_field:设置要关联的字段 3.on_delete:同ForeignKey字段
12.328ManyToManyField
用于表示多对多的关联关系,在数据库中通过第三张表来建立关联关系
多对多关联关系的三种方式:
方式一:自行创建第三张表
class Book(models.Model): title = models.CharField(max_length=32,verbose_name="书名") class Author(models.Model): name = models.CharField(max_length=32,verbose_name="作者姓名") # 自己创建第三张表 class Book2Author(models.Model): id = models.AutoField(primary_key=True) book = models.ForeignKey(to="Book") author = models.ForeignKey(to="Author") #first_blood = models.DateField() 自行创建第三章表,便于增加新字段 class Meta: unique_together = ("author", "book") 1.unique_together:联合唯一索引 2.index_together:联合索引 3.ordering:指定默认按什么字段排序。只有设置了该属性,查询到的结果才可以被reverse()
方式二:通过ManyToManyField自动创建第三张表
class Book(models.Model): title = models.CharField(max_length=32, verbose_name="书名") # 通过ORM自带的ManyToManyField自动创建第三张表 class Author(models.Model): name = models.CharField(max_length=32, verbose_name="作者姓名") books = models.ManyToManyField(to="Book", db_table="author2book",related_name="authors") class Meta: db_table = "author" 1.to:设置要关联的表 2.db_table="author2book":指定自动创建的第三张表的表名为author2book,而不是app01_author_book 3.related_name="authors":反向操作时,使用的字段名,用于代替原反向查询时的'表名_set',同ForeignKey字段 4.Meta:db_table,创建author表时指定表名为author,而不是app01_author
方式三:设置ManyTomanyField并指定自行创建的第三张表
class Book(models.Model): title = models.CharField(max_length=32,verbose_name="书名") class Author(models.Model): name = models.CharField(max_length=32,verbose_name="作者姓名") books = models.ManyToManyField( to="Book", through="Book2Author", through_fields=('author', 'book') ) # 自己创建第三张表 class Book2Author(models.Model): id = models.AutoField(primary_key=True) book = models.ForeignKey(to="Book") author = models.ForeignKey(to="Author") #first_blood = models.DateField() 自行创建第三章表,便于增加新字段 class Meta: unique_together = ("author", "book") 1.to:设置要关联的表 2.through_fields:设置关联的字段,接受一个2元组('field1','field2'):其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名,表示第三张表author,book字段是描述多对多关系的,其他的字段的ForeignKey是单纯的多对一外键。 3.through:在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。
注意:
但是当我们使用第三种方式创建多对多关联关系时,就无法使用set、add、remove、clear方法来管理多对多的关系了,只能使用all方法拿到对象,需要通过第三张表的model来管理多对多关系。
12.3281使用方式一或方式三的查询和其他操作
查询操作:
# 找到第一本书 ret = models.Book.objects.first().author2book_set.all().values("author__name") ret = models.Book.objects.filter(id=1).values("author2book__author__name")
增删改操作:
first_book = models.Book.objects.first() # 改:first_book.author.add(1): models.Author2Book.objects.create(book=first_book, author_id=1) # 清空:first_book.author.clear() models.Author2Book.objects.filter(book=first_book).delete() # 删除:first_book.author.remove(3) models.Author2Book.objects.filter(book=first_book, author_id=3).delete() # 查:first_book.author.all() 方式三可用 models.Author2Book.objects.filter(book=first_book)
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式