1、字段类型

CharField()

  • 数据库类型:varchar
  • 注意:必须要指定 max_length 参数值 ```python from django.db import models

Create your models here.

class Category(models.Model):

  1. name = models.CharField(max_length=50, unique=True, verbose_name="分类名称")
  2. # 定义数据表的name字段(最大长度50个字节,唯一)
  3. # 字符串类型,max_length是必填参数
  1. <a name="ZHPip"></a>
  2. ## TextField()
  3. - 数据库类型:longtext
  4. - 作用:表示不定长的字符数据
  5. ```python
  6. class Article(models.Model):
  7. content = models.TextField(verbose_name="文章内容")

IntegerField()

  • 数据库类型:int
  • 编程语言和数据库中使用整数
  • SmallIntegerField() 长度小的整数类型

    BooleanField()

  • 数据库类型:tinyint(1)

  • 编程语言中:使用True或False来表示值
  • 在数据库中:使用1或0来表示具体的值

    DateField()

  • 数据库类型:data

  • 作用:表示日期
  • 参数

    • auto_now:每次保存对象时,自动设置该字段为当前时间(取值:True/False)
    • auto_now_add:当对象第一次被创建时自动设置当前时间(取值:True/False)
    • default:设置当前时间(取值:字符串格式时间,如:’2022-3-6’)
    • 注意:以上上个参数只能多选一

      DateTimeField()

  • 数据库类型:datatime(6)

  • 作用:表示日期和时间
  • 参数同DateField

    FloatField()

  • 数据库类型:double

  • 编程语言中和数据库中都使用小数表示值

    DecimalField()

  • 数据库类型:decimal(x,y)

  • 编程语言中:使用小数表示该列的值
  • 在数据库中:使用小数
  • 参数:

    • max_digits:位数总数,包括小数点后的位数。该值必须大于等于decimal_places
    • decimal_places:小数点后的数字数量

      EmailField()

  • 数据库类型:varchar

  • 编程语言和数据库中使用字符串

    ImageField()

  • 数据库类型:varchar(100)

  • 作用:在数据库中为了保存图片的路径
  • 编程语言和数据库中使用字符串
  • upload_to=’./static’ 指定文件存储位置 (必须存储到数据库后,文件才会落到指定的位置)

2、字段选项

字段选项,指定创建的列的额外的信息
允许出现多个字段选项,多个选项之间使用,隔开

primary_key 主键

  • 如果设置为True,表示该列为主键,如果指定一个字段为主键,则此数据表不会创建id字段

    blank 是否可以为空

  • 设置为True时,请求字段可以为空。设置为False时,字段是必须填写的

  • blank=True 表单 forms 类 就不校验这个参数必传了

    null

  • 如果设置为True,表示该列值允许为空

  • 默认为False,如果此选项为False建议加入default选项来设置默认值
  • null=True 数据库表字段这个值可以为空

    default 默认值

  • 设置所在列的默认值,如果字段选项 null=False 建议添加此项

    verbose_name 名称

  • 设置此字段在admin界面上的显示名称

    db_index

  • 如果设置为True,表示为该列增加索引

    unique 唯一

  • 如果设置为True,表示该字段在数据库中的值必须是唯一(不能重复出现)

    db_column

  • 指定列的名称,如果不指定的话则采用属性名作为列名

upload_to=’./static’

  • 指定文件存储位置

    on_delete 删除时说明(级联删除)

  • on_delete = models.CASCADE #关联删除,删除关联字段后,该字段也同时删除

  • on_delete = models.DO_NOTHING #删除后什么也不做
  • on_delete =models.SET #设置成指定的值 例如:models.SET(1) 删除关联字段后,本字段设置成1
  • on_delete =models.SET_NULL #设置成null
  • on_delete =models.SET_DEFAULT #设置成默认值,前提是你这个字段得有默认值
  • on_delete =models.PROTECT#受保护 不允许删除

    1. class Account(models.Model):
    2. user = models.OneToOneField(User,on_delete=models.CASCADE,verbose_name="用户")
    3. money = models.IntegerField(verbose_name="余额",default=90000)
    4. # 模型字段选项
    5. # models.CASCADE cascade
    6. # 关联删除
    7. # models.DO_NOTHING
    8. # 什么也不做
    9. # models.SET 设置成指定的值
    10. # models.SET(1)
    11. # models.SET_NULL #设置成null
    12. # models.SET_DEFAULT #设置成默认值,前提是你这个字段得有默认值
    13. # models.PROTECT#受保护

    注意:
    删除没有定义键的表中的记录时,有定义键的对应的表的记录 同时会受到影响
    删除有定义键的表中的记录时,没有定义键的对应的表中的记录 不会受到影响

  • image.png

    db_constraint 多对多关系,是否建立索引

  • db_constraint=false ,不会在表里真正建立外键连接

    • 优点:提高了数据库查询速度;
    • 缺点:不利于数据维护,容易造成垃圾数据。
  • db_constraint=true,会在表里真正建立外键
    • 优点:有利于数据维护,和数据安全
    • 缺点:查询速度较慢
  • 用在映射关系是多对多的 ManyToManyField、外键字段选项

    3、模型类-Meta类常用属性

使用内部Meta类,来给模型赋予属性,Meta类下有很多内建的类属性,可以对模型类做一些控制

示例:

  1. from django.db import models
  2. # Create your models here.
  3. class Article(models.Model):
  4. title = models.CharField(max_length=80, verbose_name="文章名称")
  5. content = models.TextField(verbose_name="文章内容")
  6. # TextField长文本类型的,它不限制长度
  7. img = models.ImageField(verbose_name="文章图片", null=True, blank=True, upload_to='./static')
  8. # null=True,blank=True 修改默认允许为空
  9. category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name="归属分类")
  10. # ForeignKey定义外键
  11. create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
  12. update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True)
  13. class Meta:
  14. verbose_name = "文章" # 在admin界面上的显示名称
  15. db_table = "category" # 可改变当前模型类对应的表名
  16. # 指定数据库里实际的表名
  17. # 如果不指定,就默认生成表名 appname+classname 即 user_category
  18. verbose_name_plural = verbose_name #verbose_name的复数名字
  19. ordering = ['-update_time', 'id'] # 默认怎么排序
  20. unique_together = ["category", "title"] # 联合唯一
  21. # ordering = ['-update_time', 'id'] # 默认怎么排序
  22. # unique_together = ["category", "title"] # 联合唯一
  23. def __str__(self):
  24. return self.title

verbose_name 名称

  • 设置此数据表在admin界面上的显示名称
  • 注意:

    • 给模型对象一个易于理解的名称,用于显示在 /admin 管理界面中

      verbose_name_plural 复数名称

  • 该对象的复数形式的名称(复数),用于显示在 /admin 管理界面

    db_table 数据表名称

  • 可改变当前模型类对应的表名

  • 指定数据库里实际的表名
  • 如果不指定,就默认生成表名 appname+classname(应用名+模型类名)
  • 注意:

    • 设置完成后,需要立马更新同步数据库

      ordering 排序

  • ordering = [‘update_time’] # 按照updated_time 序排序

  • ordering = [‘-update_time’] # 按照updated_time序排序
  • ordering = [‘-update_time’, ‘id’] #组合排序,先按照updated_time序排序,再根据id再排序一次

    unique_together 联合主键(唯一)

  • 和数据库表结构有关系

  • 多个字段联合起来是唯一
  • unique_together = [“category”, “title”] # 联合唯一:一个分类下,标题只能由一个相同的