zoukankan      html  css  js  c++  java
  • Django model 字段类型及选项解析(二)

    在model中添加字段的格式一般为:  field_name = field_type(**field_options)
    
     
    
    一  field options(所有字段共用)
    
      1  null   默认为False,True则表示可以为null。(空字符串在数据库中可能被存储为'')
    
      2  blank  默认为False,True表示可以为空。
    
      3  choice  可选的,限制了该选项的字段值必须是所指定的choice中的一个。
    4  db_column  数据库column名称。默认为本字段的名称。
    
      5  db_index  如果为True的话,该字段的数据库索引将会被创建
    
      6  default   设置该字段的默认值,可以是值也可以是对象。
    
      7  editable   默认为True,若为False,则不会在admin/界面显示
    
      8  primary_key  若设置为True,则表示将该字段设置为主键。一般情况下django默认会设置一个自增长的id主键。
    
      9  unique   若设置为True,该字段值不可重复
    
    二  field type(字段类型,细分的话可以分为普通字段以及关系字段)
    
     1  普通字段
    
      1  AutoField()  根据已有id自增长的整形唯一字段,一般每个model类不需设置该字段,因为django会为每个model自动设置。
    
        django默认会为每个model类添加如下语句:id = models.AutoField(primary_key=True)  当其他字段添加了primary_key属性,则不会创建id字段了
    
        每个model类仅能有一个主键
    
      2  BooleanField()  布尔型字段,默认的表单窗口部件是CheckBoxInput
    
      3  CharField()  字符型字段,默认的表单窗口部件是TextInput。该字段类型有一个必需参数:max_length  在数据库水平限定了字符串最大长度
    
      4  DateField()  日期字段,字段的值是python中datetime.date的实例,默认的表单窗口是TextInput有几个可选的参数:
    
        auto_now=True/False:当设置为True时,每当该对象使用save()时,该字段的值就会被更新。
    
        auto_now_add=True/False: 当设置为True时,该字段的值为该对象被创建时的日期
    
      5  DateTimeField()  日期和时间字段,值为datetime.datetime实例。默认的表单窗口以及可选参数同上。
    
      6  DecimalField()  混合精度的小数型数字字段。有两个必需的参数:
    
        max_digits=ingt_number:限定数字的最大位数(包含小数位)
    
        decimal_places=int_number:存储数字的小数位
    
    #to store numbers up to 999 with a resolution of 2 decimal places, you’d use
    models.DecimalField(..., max_digits=5, decimal_places=2)
       7  EmailField(max_length=254, **options)  邮件字段,使用EmailValidator进行验证
    
      8  FileField(upload_to=None, max_length=100, **options)  文件上传字段。
    
      这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100.
    
      有两个可选参数:
    
        upload_to
    
          如果使用默认的FileSystomStorage,文件将会存储到settings文件中配置的MEDIA_ROOT路径中。
    
          upload_to的值也可以为可调用对象,通过调用这个对象可以获得上传路径。
    
            instance=:  定义了FileField的模型实例
    
            filename='':  文件名称。
     1 class MyModel01(models.Model):
     2     # file will be uploaded to MEDIA_ROOT/uploads
     3     upload = models.FileField(upload_to='uploads/')
     4     # or...
     5     # file will be saved to MEDIA_ROOT/uploads/2015/01/30
     6     upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
     7 
     8 #upload_to=可调用对象
     9 def user_directory_path(instance, filename):
    10     # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    11     return 'user_{0}/{1}'.format(instance.user.id, filename)
    12 
    13 class MyModel02(models.Model):
    14     upload = models.FileField(upload_to=user_directory_path)
    示例
       storage  用来设定文件存储仓库    
    
      9  FilePathField(path=None, match=None, recursive=False, max_length=100, **options)
    
        这个字段的值被限制在系统上某个目录中的所有文件名集合中。有三个参数
    
        path='':  该参数必需。上行所说的‘某个目录’的绝对路径。Example: "/home/images".
    
        match='pattern':  可选参数。格式是正则表达式。用来拣选符合匹配正则表达式的文件
    
        recursive=True/False: 可选参数,默认为False。设定是否递归该目录下所有子目录的所有文件。    
    
    FilePathField(path="/home/images", match="foo.*", recursive=True)
      10  FloatField()  浮点字段,默认的表单窗口部件是NumberInput。和DecimalField经常混淆不清,
    
        FloatField在内部使用Python中的float对象,而DecimalField在内部使用Python中的decimal对象。
    
      11  ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options) 
    
        图像字段。继承了FileField的所有属性和方法。而且还能自动验证上传的对象是否为合法的图像。
    
      12  IntegerField  整形字段。
    
      13  GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)  ip地址字段
    
        protocol='both/ipv4/ipv6'  默认为both
    
        unpack_ipv4   用处不大。
    
      14  NullBooleanField  类似于BooleanField,不同的是其允许值为null
    
      15  TextField()   与CharField类似,但一般用来存储体积较大的文本。
    
      16  TimeField(auto_now=False, auto_now_add=False, **options)   时间字段,其值为datetime.time实例
    
      17  URLField(max_length=200, **options)    URL字段
    
        类似于CharField的子类,默认最大长度为200.
    
      18  UUIDField(**options)  通用唯一标识字段,当不想用django默认设置的AutoField字段时,可以用该字段代替。
    
     
    
      2  关系字段
    
      关系字段:一对一,多对一,多对多
    
      一对一:  现在有很多一对一辅导班,也就是上课时,一个老师对应一个学生,一个学生对应一个老师
    
      多对一:  很多偏远山区的学校可能整个学校只有一个老师,这一个老师对应多个学生,所有的学生对应这一个老师
    
      多对多:  而我们则很幸福,学校里有许多老师,一个老师教习一科,学生有多个老师,老师有多个学生。
    
      1  ForeignKey(othermodel, on_delete, **options)  多对一或者一对多或者外键字段。
    
        othermodel:  所关联的模型,'' model使用外键关联  ''model。
    
          当所关联的模型为他自己时,使用'self'
    
          当引用的模型为其他app中的模型时,要加上app名称标签:  'app_name.model_name'
    
          数据库会自动在外键字段上创建索引,可以使用de_index=False关闭该功能。
    
        on_delete: 当删除 "" 模型对象时,django会根据该参数的值对与该对象相关联的其他对象(也就是 ‘多’)进行操作。
    
            在django1.9以及之前的版本中,on_delete作为一个关键字参数。而在1.10则可以作为第二个参数
    
          models.CASCADE:   默认为models.CASCADE   级联删除。当删除''时,‘多’会被删除。比如:
     1 # mysite项目下名为polls的app中的models.py
     2 class follower(models.Model):
     3     name = models.CharField(max_length=200)
     4     menpai = models.ForeignKey('menpai', on_delete=models.CASCADE)  #定义了models.CASCADE属性
     5 
     6     def __str__(self):
     7         return self.name
     8 
     9 class menpai(models.Model):
    10     name = models.CharField(max_length=200)
    11 
    12     def __str__(self):
    13         return self.name
    14 
    15 #运行 python3 manager.py shell进入交互页面
    16 >>> from polls.models import follower,menpai
    17 >>> m1=menpai(name='huashanpai')   
    18 >>> m1.save()
    19 >>> m2=menpai(name='riyuejiao')
    20 >>> m2.save()
    21 >>> f1=follower(name='linghuchong',menpai=m1)
    22 >>> f1.save()
    23 >>> f2=follower(name='renwoxing',menpai=m2)
    24 >>> f2.save()
    25 >>> f1.menpai
    26 <menpai: huashanpai>
    27 >>> m1.delete()
    28 (2, {'polls.menpai': 1, 'polls.follower': 1})   # 删除华山派时,将令狐冲也删除了
    View Code
     modles.PROTECT :    当删除一个具有外键关系的对象时,会引发一个异常,阻止删除该对象
    
          models.SET_NULL:   设置删除对象所关联的外键字段为null。但字段的null属性必需为True
    
          models.SET_DEFAULT :    设置删除对象所关联的外键字段为默认的值。
    
          models.SET(value)  :设置删除对象所关联的对象的外键字段为value,value也可以是一个可调用函数。
     1 from django.conf import settings
     2 from django.contrib.auth import get_user_model
     3 from django.db import models
     4 
     5 def get_sentinel_user():
     6     return get_user_model().objects.get_or_create(username='deleted')[0]
     7 
     8 class MyModel(models.Model):
     9     user = models.ForeignKey(
    10         settings.AUTH_USER_MODEL,
    11         on_delete=models.SET(get_sentinel_user),
    12     )
    View Code

      models.DO_NOTHING :  不做任何操作

        limit_choices_to  限制该字段为选项形。格式:limit_choices_to={'is_staff'True}。值也可以为可调用函数。

    1 def limit_pub_date_choices():
    2     return {'pub_date__lte': datetime.date.utcnow()}
    3 
    4 limit_choices_to = limit_pub_date_choices
    View Code
     1  related_name  设置从关联对象到自身的关系的名称,若值为'+'  则关联对象与自身无逆向关系。详解请看官方文档。
     2 
     3     to_field  设置所关联对象的关联字段。默认为关联对象的主键字段。
     4 
     5     
     6 
     7   2  ManyToManyField(othermodel, **options)  多对多字段。
     8 
     9     othermodel:  所关联的model名称
    10 
    11     db_table:  多对多关系会在两个模型所对应的表中间创建一个‘中间表’ ,将多对多转换为两个多对一,该选项为这个中间表设置名称。一般来说django会默认为中间表创建名称,但人们读起来可能搞不清楚究竟中间表关联到了哪里。
    12 
    13     related_name:  同多对一字段中的related_name
    14 
    15     limite_choices_to:  同....
    16 
    17     symmetrical:  当多对多关联对象为自身时可能会用到的参数。默认为True。a,b同属于person模型,person中的friends字段与自身设置了多对多关系,当该值设置为True时,django假定关系为对称,即:a是b的朋友,那么b也是a的朋友。设置为False时,django会强制为逆向关系创建描述信息。
    18 
    19     though:  不想让django自动创建中间表,手动创建中间表所对应的model,通过though指定对应的model名称。
    20 
    21     though_field:  当though参数被使用时,该参数才会有效。指定使用哪些中间模型字段来确立两个模型的多对多关系。
    22 
    23   3  OneToOneField(othermodel, on_delete, parent_link=False, **options)  一对一字段。
    24 
    25     othermodel: .......
    26 
    27     on_delete:........
    28 
    29     related_name:...........
    View Code
  • 相关阅读:
    数据库分页
    SpringBoot 集成 MQTT
    mybatis的级联查询-懒加载遇到的序列化问题
    springboot学习:第二天
    SpringSecurity学习
    大日志文件查看方式
    logger(七)、springBoot的日志源码查看(LogBack + slf4j)——配置的实际工作类Action
    logger(六)、springBoot的日志源码查看(LogBack + slf4j)—— ContextInitializer
    logger(五)、springBoot的日志源码查看(LogBack + slf4j)——Appender
    logger(四)、springBoot的日志源码查看(LogBack + slf4j)——记录日志
  • 原文地址:https://www.cnblogs.com/sun1994/p/8575735.html
Copyright © 2011-2022 走看看