Django models 模型

8 篇文章 1 订阅
6 篇文章 1 订阅

模型

  1. Django 模型是描述数据的,它包含存储数据的重要字段和行为。 一个模型映射一张数据库表。

  2. 模型采用ORM来映射数据库表。

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
  • 模型类的每个属性都相当于一个数据库的字段
  • 利用模型访问数据库进行查询
  1. 如果模型中未定义主键,则表(模型)会字段添加一个id自增字段;如果显式地设置了primary_key,将不会自动在表(模型)中添加 id 列

  2. 要使模型映射到数据库表需要运行 py manage.py migrate, 与此同时,可以 py manage.py makemigrations 命令进行迁移成文件,方便以后检查、调用、重做等等

  3. 如果定义了模型且要使用它,需要在 setting.py 中的 INSTALLED_APPS 添加由 manage.py startapp 创建的app名称

字段(Field)

字段类型

字段类型
AutoField自动递增
BigAutoField64位AutoField
BigIntegerField64位整数IntegerField
BinaryField二进制数据
BooleanField布尔值
CharField字符串
DateField日期
DateTimeField日期和时间
DecimalField固定精度的十进制数字
DurationField存储时间段
EmailField电子邮件地址
FileField文件
FilePathField文件路径
FloatField浮点数
ImageField图像
IntegerField整数
GenericIPAddressField字符串格式的IPv4或IPv6地址
NullBooleanFieldnull(null=True)
PositiveIntegerField正整数
PositiveSmallIntegerField正短整数或0
SlugField仅包含字母,数字,下划线或连字符, 用于URL
SmallAutoField小整数AutoField
SmallIntegerField小整数IntegerField
TextField文本类型
TimeField时间
URLFieldURL
UUIDField用于存储通用唯一标识符
ForeignKey多对一的关系 (关联关系字段)
ManyToManyField多对多关系 (关联关系字段)
OneToOneField一对一关系 (关联关系字段)

字段选项

选项功能
max_length指定数据库存储数据时用的字节数
null字段为空时,将数据库中该字段设置为 NULL。默认为 False
blank字段允许为空。默认为 False
choices将二元组用作此字段的选项; 每个二元组的第一个值会储存在数据库中,而第二个值将只会用于在表单中显示
db_column字段的数据库列的名称
db_index为字段创建数据库索引
db_tablespace如果字段已建立索引,则用于该字段的索引的数据库表空间的名称
default字段的默认值
editable字段是否可编辑
error_messages字段错误时引发的提示,值是一个字典
help_text额外的“帮助”文本
primary_key字段设置为该模型的主键
unique字段的值必须在整个表中保持唯一
unique_for_date日期字段或日期时间字段的值唯一
unique_for_month日期字段或日期时间字段中的月份的值唯一
unique_for_year日期字段或日期时间字段中的年份的值唯一
verbose_name该字段的可读名称
through指定多对多关系使用哪个中间模型 (ManyToManyField)如果中间模型有多个外键需要使用 through_fields 手动选择一个外键

字段属性

属性功能
auto_created是否自动创建该字段
concrete是否具有与其关联的数据库列
hidden是否使用一个字段来支持另一个非隐藏字段的功能
is_relation是否包含一个或多个其他模型的功能
model返回定义字段的模型
👇关系字段属性👇
many_to_many该字段是否具有多对多关系
many_to_one该字段是否具有多对一关系
one_to_many字段是否具有一对多关系
one_to_one字段是否具有一对一关系
related_model指向与该领域相关的模型

字段命名限制

错误命名解释
Python保留字Python语法错误
字段名包含连续的多个下划线(两个及两个以上)Django查询语法中使用双下划线提供其他功能
下划线结尾Django查询语法中使用双下划线提供其他功能
模型API名称如 Save、from_db、refresh_from_db、get_deferred_fields、clean_fields、clean、validate_unique、full_clean、clean_fields、update、pk、delete等与模型 API 名称冲突

跨文件模型

模型的关系可以使用非本文件内的模型进行关联,只需import需要被关联的模型即可

官方示例:

from django.db import models
from geography.models import ZipCode

class Restaurant(models.Model):
    # ...
    zip_code = models.ForeignKey(
        ZipCode,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )

Meta

使用内部 Meta类 来给模型赋予元数据(元数据:所有不是字段的东西)

Meta选项

属性功能
👇可用Meta选项👇
abstract设置抽象模型
app_label如果模型是在INSTALLED_APPS中的应用程序之外定义的,它必须声明它属于哪个应用程序
base_manager_name管理者的属性名称
db_table数据库表名
db_tablespace模型的数据库表空间的名称
default_manager_name用于模型的_default_manager的管理器的名称
default_related_name从相关对象到该对象的关系使用的名称
get_latest_by模型中的字段名称或字段名称列表,这指定了要在模型管理器的Latest()和earlyest()方法中使用的默认字段。
managed默认值为True,表示Django将在migrate迁移过程中或迁移过程中创建适当的数据库表,并将其作为flush管理命令的一部分删除。如果为False,则不会对此模型执行数据库表创建或删除操作。
order_with_respect_to给定字段可排序(通常为ForeignKey)
ordering默认排序
permissions创建此对象时可进入权限表的额外权限
default_permissions默认权限
proxy代理
required_db_features当前连接应具有的数据库功能列表,以便在迁移阶段考虑模型
required_db_vendor该模型特定于的受支持数据库供应商的名称
select_on_save通常不需要设置此属性。默认值为 False
indexes索引
unique_togetherunique共存
index_togetherindex共存
constraints定义约束
verbose_name对象的易读名称
verbose_name_plural对象的复数名称
👇只读Meta属性👇
label对象的表示,返回app_label.object_name
label_lower模型的表示,返回app_label.model_name

模型属性

模型当中最重要的属性是 Manager。 它是 Django 模型和数据库查询操作之间的接口,并且它被用作从数据库当中获取实例,如果没有指定自定义的 Manager 默认名称是 objectsManager 只能通过模型类来访问,不能通过模型实例来访问

模型方法

在模型中添加自定义方法会给你的对象提供自定义的“行级”操作能力

重写模型方法

模型的方法可以被重写以方便定制需求

官方文档
https://docs.djangoproject.com/zh-hans/3.0/topics/db/models/#overriding-predefined-model-methods

执行原生SQL

执行原生SQL使用 Manager.raw()django.db.connection 对象

模型继承

模型继承与普通类继承工作方式几乎完全相同,它可以单继承或者多继承

官方示例:

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

抽象基类

编写模型基类,并在 Meta 类中填入 abstract=True。该模型将不会创建任何数据表,然后在字类模板中继承它。

官方示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

Meta 继承

Meta也可以被继承

官方示例:


class CommonInfo(models.Model):
    # ...
    class Meta:
        abstract = True
        ordering = ['name']

class Student(CommonInfo):
    # ...
    class Meta(CommonInfo.Meta):
        db_table = 'student_info'

代理模型

代理模型继承中子类只用于管理父类的数据,而不实际存储数据

一个代理模型必须继承自一个非抽象模型类;一个代理模型可以继承任意数量的抽象模型类

官方示例:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值