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)

