zoukankan      html  css  js  c++  java
  • 【Django入坑之路】Models操作

    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         - 二进制类型
    View Code

    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             
    View Code

    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
    View Code

    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,              # 默认创建第三张表时,数据库中表的名称
    View Code
  • 相关阅读:
    Beta冲刺——集合随笔
    Beta冲刺——用户调查报告
    Beta冲刺——总结
    Beta冲刺——代码规范、冲刺任务与计划
    Beta冲刺——Day 7
    Beta冲刺——Day 6
    Beta冲刺——Day 5
    Beta冲刺——Day 4
    Beta冲刺——Day3
    beta冲刺汇总
  • 原文地址:https://www.cnblogs.com/wanghong1994/p/11595614.html
Copyright © 2011-2022 走看看