模型是你的数据的唯一的、权威的信息源。

  • django.db.models.Model 的一个Python 子类。
  • 模型的每个属性都表示为数据库中的一个字段。
  • Django 提供一套自动生成的用于数据库访问的API.

使用模型:appy应用后 manage.py makemigrations;manage.py migrate (表或表字段有更改时也需要做数据迁移)

字段:

字段类型:


字段类型

  • AutoField:一个根据实际ID自动增长的IntegerField,通常不指定
    • 如果不指定,一个主键字段将自动添加到模型中(用的时候为防止和自定义的ID冲突,可以用PK)
  • BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
  • NullBooleanField:支持null、true、false三种值
  • CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
  • TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea
  • IntegerField:整数
  • DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
    • DecimalField.max_digits:位数总数
    • DecimalField.decimal_places:小数点后的数字位数
  • FloatField:用Python的float实例来表示的浮点数
  • DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期
    • 参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
    • 参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
    • 该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
    • auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
  • TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
  • DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
  • FileField:一个上传文件的字段
  • ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image

字段选项:

  通过字段选项,可以实现对字段的约束,在字段对象时通过关键字参数指定

  • null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
  • blank:如果为True,则该字段允许为空白,默认值是 False(django admin填充数据时允许为空)
  • 对比:null是数据库范畴的概念,blank是表单验证证范畴的
  • db_column:字段的名称,如果未指定,则使用属性的名称
  • db_index:若值为 True, 则在表中会为此字段创建索引
  • default:默认值
  • primary_key:若为 True, 则该字段会成为模型的主键字段
  • unique:如果为 True, 这个字段在表中必须有唯一值
  • choices 它是一个可迭代的结构(比如,列表或是元组),由可迭代的二元组组成(比如[(A, B), (A, B)...]),用来给这个字段提供选择项。如果设置了 choices ,默认表格样式就会显示选择框,而不是标准的文本框,而且这个选择框的选项就是 choices 中的元组。每个元祖的第一个值做为select标签下option的value,第二个值为text显示文本。如果设置了choices,查询时想显示元祖第二哥元素时可用get_A_display()。
  • 通过指定 key 来确认你要重写的错误信息。
  • help_text  文本将被显示在表单控件form中

关系

ORM:objects relationship map 对象关系映射

  表名(app名_表名)--------类名

  字段--------属性

  表记录--------类实例对象

关系的类型包括

  • ForeignKey:一对多,将字段定义在多的端中 
    • models.ForeignKey('self')。

    •  来创建数据库中的列名
    • 参数:
      • related_name:用于让关联的对象反查到源对
      • to_field:关联到的关联对象的字段名称
      • db_constraint:控制是否在数据库中为这个外键创建约束。默认值为True,如果被设置成False,访问一个不存在的关联对象将抛出 DoesNotExist 异常。
      • on_delete:当一个ForeignKey 引用的对象被删除时,Django 默认模拟SQL 的ON DELETE CASCADE 的约束行为,并且删除包含该ForeignKey的对象。 选项:CASCADE:级连删除,默认;PROTECT:抛出ProtectedError 以阻止被引用对象的删除。
  • ManyToManyField:多对多,将字段定义在两端中 
    • 建议:不建议从一个没有迁移的应用中创建一个ManyToManyField到一个具有迁移的应用
    • 数据库中的表示:默认情况下,会创建一张中间表,该表的名称使用多对多字段的名称和包含这张表的模型的名称生成,表名:app名_关联表1名_关联表2名,字段:自增主键,关联表1名_id,关联表2名_id
    • 参数:
      • related_name;
      • through:through 选项来指定自己手动创建的第三张表
      • through_field:指定表后可以指定字段
           members = models.ManyToManyField(Person, through='Membership', through_fields=('group', 'person'))
  • OneToOneField:一对一,将字段定义在任意一端中

选项:

Meta 定义模型的元数据,可用的参数:

  • ordering:对象默认的顺序,获取一个对象的列表时使用,符串前加-表示倒序,不加-表示正序
  • unique_togethe:联合主键;

  • verbose_name:对象的一个易于理解的名称,为单数;
    from django.db import models
    
    class Ox(models.Model):
        horn_length = models.IntegerField()
    
        class Meta:
            ordering = ['-order_date']
            unique_together = ("driver", "restaurant")
        
        
    示例

相关文章:

  • 2021-10-30
  • 2021-09-27
  • 2021-07-23
  • 2021-11-10
  • 2021-06-25
  • 2021-11-07
  • 2022-01-01
猜你喜欢
  • 2021-10-07
  • 2021-11-07
  • 2022-02-01
  • 2022-12-23
  • 2021-08-13
  • 2022-02-20
相关资源
相似解决方案