欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django的Models操作

程序员文章站 2023-08-23 09:08:22
1:字段 1 AutoField(Field) 2 - int自增列,必须填入参数 primary_key=True 3 4 BigAutoField(AutoField) 5 - bigint自增列,必须填入参数 primary_key=True 6 7 注:当model中如果没有自增列,则自动会 ......

1:字段

  1 autofield(field)
  2         - int自增列,必须填入参数 primary_key=true
  3 
  4 bigautofield(autofield)
  5         - bigint自增列,必须填入参数 primary_key=true
  6 
  7         注:当model中如果没有自增列,则自动会创建一个列名为id的列
  8         from django.db import models
  9 
 10         class userinfo(models.model):
 11             # 自动创建一个列名为id的且为自增的整数列
 12             username = models.charfield(max_length=32)
 13 
 14         class group(models.model):
 15             # 自定义自增列
 16             nid = models.autofield(primary_key=true)
 17             name = models.charfield(max_length=32)
 18 
 19 smallintegerfield(integerfield):
 20         - 小整数 -32768 ~ 32767
 21 
 22 positivesmallintegerfield(positiveintegerreldbtypemixin, integerfield)
 23         - 正小整数 0 ~ 32767
 24     integerfield(field)
 25         - 整数列(有符号的) -2147483648 ~ 2147483647
 26 
 27 positiveintegerfield(positiveintegerreldbtypemixin, integerfield)
 28         - 正整数 0 ~ 2147483647
 29 
 30 bigintegerfield(integerfield):
 31         - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
 32 
 33 booleanfield(field)
 34         - 布尔值类型
 35 
 36 nullbooleanfield(field):
 37         - 可以为空的布尔值
 38 
 39 charfield(field)
 40         - 字符类型
 41         - 必须提供max_length参数, max_length表示字符长度
 42 
 43 textfield(field)
 44         - 文本类型
 45 
 46 emailfield(charfield):
 47         - 字符串类型,django admin以及modelform中提供验证机制
 48 
 49 ipaddressfield(field)
 50         - 字符串类型,django admin以及modelform中提供验证 ipv4 机制
 51 
 52 genericipaddressfield(field)
 53         - 字符串类型,django admin以及modelform中提供验证 ipv4和ipv6
 54         - 参数:
 55             protocol,用于指定ipv4或ipv6, 'both',"ipv4","ipv6"
 56             unpack_ipv4, 如果指定为true,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both"
 57 
 58 urlfield(charfield)
 59         - 字符串类型,django admin以及modelform中提供验证 url
 60 
 61 slugfield(charfield)
 62         - 字符串类型,django admin以及modelform中提供验证支持 字母、数字、下划线、连接符(减号)
 63 
 64 commaseparatedintegerfield(charfield)
 65         - 字符串类型,格式必须为逗号分割的数字
 66 
 67 uuidfield(field)
 68         - 字符串类型,django admin以及modelform中提供对uuid格式的验证
 69 
 70 filepathfield(field)
 71         - 字符串,django admin以及modelform中提供读取文件夹下文件的功能
 72         - 参数:
 73                 path,                      文件夹路径
 74                 match=none,                正则匹配
 75                 recursive=false,           递归下面的文件夹
 76                 allow_files=true,          允许文件
 77                 allow_folders=false,       允许文件夹
 78 
 79 filefield(field)
 80         - 字符串,路径保存在数据库,文件上传到指定目录
 81         - 参数:
 82             upload_to = ""      上传文件的保存路径
 83             storage = none      存储组件,默认django.core.files.storage.filesystemstorage
 84 
 85 imagefield(filefield)
 86         - 字符串,路径保存在数据库,文件上传到指定目录
 87         - 参数:
 88             upload_to = ""      上传文件的保存路径
 89             storage = none      存储组件,默认django.core.files.storage.filesystemstorage
 90             width_field=none,   上传图片的高度保存的数据库字段名(字符串)
 91             height_field=none   上传图片的宽度保存的数据库字段名(字符串)
 92 
 93 
 94 #时间: auto_now_add 自动创建时间
 95     create_time = models.datetimefield(auto_now_add=true)
 96 # 数据库调用时间格式化传入前端:.strftime("%y-%m-%d")
 97     time = '表对象名字'.create_time.strftime("%y-%m-%d")
 98  ps:格式化的时间传入前端不需要加|safe ,直接填写字典key就可以
 99 
100 floatfield(field)
101         - 浮点型
102 
103 decimalfield(field)
104         - 10进制小数
105         - 参数:
106             max_digits,小数总长度
107             decimal_places,小数位长度
108 
109 binaryfield(field)
110         - 二进制类型

2:字段参数

 1 null                数据库中字段是否可以为空
 2 
 3 db_column           数据库中字段的列名
 4 
 5 default             数据库中字段的默认值
 6 
 7 primary_key         数据库中字段是否为主键
 8 
 9 db_index            数据库中字段是否可以建立索引
10 
11 unique              数据库中字段是否可以建立唯一索引
12 
13 unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
14 
15 unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
16 
17 unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
18 
19 
20 verbose_name        admin中显示的字段名称
21 
22 blank               admin中是否允许用户输入为空
23 
24 editable            admin中是否可以编辑
25 
26 help_text           admin中该字段的提示信息
27 
28 choices             admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
29                         如:gf = models.integerfield(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
30 
31 error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
32                         字典健:null, blank, invalid, invalid_choice, unique, and 
33 unique_for_date
34                         如:{'null': "不能为空.", 'invalid': '格式错误'}
35 
36 validators          1 #自定义正则
37 
38  from django.core import validators
39  
40      email = forms.charfield(min_length=3, max_length=32, required=true,
41                              widget=widgets.textinput(attrs={"class": "form_text", "placeholder": "请输入您的邮箱"}),
42                              validators=[validators.regexvalidator('@', message="邮箱格式错误")]  #'@'用于写自定义正则表达式
43 
44             

3:元信息

 1 class userinfo(models.model):
 2         nid = models.autofield(primary_key=true)
 3         username = models.charfield(max_length=32)
 4         class meta:
 5             # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
 6             db_table = "table_name"
 7 
 8             # 联合索引
 9             index_together = [
10                 ("pub_date", "deadline"),
11             ]
12 
13             # 联合唯一索引
14             unique_together = (("driver", "restaurant"),)
15 
16             # admin中显示的表名称
17             verbose_name
18 
19             # verbose_name加s
20             verbose_name_plural

4:多表关系以及参数

  1 foreignkey(foreignobject) # foreignobject(relatedfield)
  2         to,                         # 要进行关联的表名
  3         to_field=none,              # 要关联的表中的字段名称
  4         on_delete=none,             # 当删除关联表中的数据时,当前表与其关联的行的行为
  5                                         - models.cascade,删除关联数据,与之关联也删除
  6                                         - models.do_nothing,删除关联数据,引发错误integrityerror
  7                                         - models.protect,删除关联数据,引发错误protectederror
  8                                         - models.set_null,删除关联数据,与之关联的值设置为null(前提fk字段需要设置为可空)
  9                                         - models.set_default,删除关联数据,与之关联的值设置为默认值(前提fk字段需要设置默认值)
 10                                         - models.set,删除关联数据,
 11                                                       a. 与之关联的值设置为指定值,设置:models.set(值)
 12                                                       b. 与之关联的值设置为可执行对象的返回值,设置:models.set(可执行对象)
 13 
 14                                                         def func():
 15                                                             return 10
 16 
 17                                                         class mymodel(models.model):
 18                                                             user = models.foreignkey(
 19                                                                 to="user",
 20                                                                 to_field="id"
 21                                                                 on_delete=models.set(func),)
 22         related_name=none,          # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
 23         related_query_name=none,    # 反向操作时,使用的连接前缀,用于替换【表名】     如: models.usergroup.objects.filter(表名__字段名=1).values('表名__字段名')
 24         limit_choices_to=none,      # 在admin或modelform中显示关联数据时,提供的条件:
 25                                     # 如:
 26                                             - limit_choices_to={'nid__gt': 5}
 27                                             - limit_choices_to=lambda : {'nid__gt': 5}
 28 
 29                                             from django.db.models import q
 30                                             - limit_choices_to=q(nid__gt=10)
 31                                             - limit_choices_to=q(nid=8) | q(nid__gt=10)
 32                                             - limit_choices_to=lambda : q(q(nid=8) | q(nid__gt=10)) & q(caption='root')
 33         db_constraint=true          # 是否在数据库中创建外键约束
 34         parent_link=false           # 在admin中是否显示关联数据
 35 
 36 
 37     onetoonefield(foreignkey)
 38         to,                         # 要进行关联的表名
 39         to_field=none               # 要关联的表中的字段名称
 40         on_delete=none,             # 当删除关联表中的数据时,当前表与其关联的行的行为
 41 
 42                                     ###### 对于一对一 ######
 43                                     # 1. 一对一其实就是 一对多 + 唯一索引
 44                                     # 2.当两个类之间有继承关系时,默认会创建一个一对一字段
 45                                     # 如下会在a表中额外增加一个c_ptr_id列且唯一:
 46                                             class c(models.model):
 47                                                 nid = models.autofield(primary_key=true)
 48                                                 part = models.charfield(max_length=12)
 49 
 50                                             class a(c):
 51                                                 id = models.autofield(primary_key=true)
 52                                                 code = models.charfield(max_length=1)
 53 
 54     manytomanyfield(relatedfield)
 55         to,                         # 要进行关联的表名
 56         related_name=none,          # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
 57         related_query_name=none,    # 反向操作时,使用的连接前缀,用于替换【表名】     如: models.usergroup.objects.filter(表名__字段名=1).values('表名__字段名')
 58         limit_choices_to=none,      # 在admin或modelform中显示关联数据时,提供的条件:
 59                                     # 如:
 60                                             - limit_choices_to={'nid__gt': 5}
 61                                             - limit_choices_to=lambda : {'nid__gt': 5}
 62 
 63                                             from django.db.models import q
 64                                             - limit_choices_to=q(nid__gt=10)
 65                                             - limit_choices_to=q(nid=8) | q(nid__gt=10)
 66                                             - limit_choices_to=lambda : q(q(nid=8) | q(nid__gt=10)) & q(caption='root')
 67         symmetrical=none,           # 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段
 68                                     # 做如下操作时,不同的symmetrical会有不同的可选字段
 69                                         models.bb.objects.filter(...)
 70 
 71                                         # 可选字段有:code, id, m1
 72                                             class bb(models.model):
 73 
 74                                             code = models.charfield(max_length=12)
 75                                             m1 = models.manytomanyfield('self',symmetrical=true)
 76 
 77                                         # 可选字段有: bb, code, id, m1
 78                                             class bb(models.model):
 79 
 80                                             code = models.charfield(max_length=12)
 81                                             m1 = models.manytomanyfield('self',symmetrical=false)
 82 
 83         through=none,               # 自定义第三张表时,使用字段用于指定关系表
 84         through_fields=none,        # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表
 85                                         from django.db import models
 86 
 87                                         class person(models.model):
 88                                             name = models.charfield(max_length=50)
 89 
 90                                         class group(models.model):
 91                                             name = models.charfield(max_length=128)
 92                                             members = models.manytomanyfield(
 93                                                 person,
 94                                                 through='membership',
 95                                                 through_fields=('group', 'person'),
 96                                             )
 97 
 98                                         class membership(models.model):
 99                                             group = models.foreignkey(group, on_delete=models.cascade)
100                                             person = models.foreignkey(person, on_delete=models.cascade)
101                                             inviter = models.foreignkey(
102                                                 person,
103                                                 on_delete=models.cascade,
104                                                 related_name="membership_invites",
105                                             )
106                                             invite_reason = models.charfield(max_length=64)
107         db_constraint=true,         # 是否在数据库中创建外键约束
108         db_table=none,              # 默认创建第三张表时,数据库中表的名称