django的Models用法

Django的Models是数据的蓝图,定义了数据库的字段和行为。每个模型映射到数据库表,字段类型如CharField、ForeignKey等,字段选项如null、blank、choices等。模型可以进行多对一、多对多、一对一关联关系。Meta类用于提供模型元数据,如表名、排序选项。模型方法可添加自定义行为。此外,模型支持抽象基类、多表继承、代理模型等多种继承方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模型是关于您的数据的单一的、确定的信息来源。它包含您存储的数据的基本字段和行为。通常,每个模型映射到单个数据库表。


基础知识:

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
  • 模型类的每个属性都相当于一个数据库的字段。
  • 综上诉说,Django 给你一个自动生成访问数据库的 API;请参阅 Making queries

简单的例子

这个样例模型定义了一个 Person, 其拥有 first_name 和 last_name:

from django.db import models

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

firstnamelastname 是模型的字段。每个字段都被指定为class属性,每个属性映射到数据库列。

上面的Person模型会创建一个这样的数据库表:

CREATE TABLE myapp_person (
        "id" serial NOT NULL PRIMARY KEY,
        "first_name" varchar(30) NOT NULL,
        "last_name" varchar(30) NOT NULL
    );

一些技术上的说明:

  • 该表的名称 “myapp_person” 是自动从某些模型元数据中派生出来,但可以被改写。有关更多详细信息,请参阅:表命名。
  • 一个 id 字段会被自动添加,但是这种行为可以被改写。请参阅:默认主键字段。
  • The CREATE TABLE SQL in this example is formatted using PostgreSQL syntax, but it’s worth noting Django uses SQL tailored to the database backend specified in your settings file.

使用模型

一旦你定义了你的模型,你需要告诉Django你将会使用这些模型。通过编辑你的设置文件和改变 INSTALLED_APPS 设置来添加包含你的 models.py 的模块的名称来实现这一点。

例如,如果您的应用程序的模型存在于模块myapp.models(为应用程序创建的包结构 manage.py startapp 脚本),**INSTALLED_APPS 应该阅读部分内容:

 INSTALLED_APPS = [
    #...
    'myapp',
    #...
]

当你添加新的APP到 INSTALLED_APPS, 去报先执行manage.py migrate,有时候需要限制性 manage.py makemigrations.

字段

模型中最重要的部分——以及模型中唯一需要的部分——是它定义的数据库字段列表。字段由class属性指定。注意不要选择与模型API冲突的字段名,如clean, save 或者 delete.

例子

from django.db import models

    class Musician(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        instrument = models.CharField(max_length=100)

    class Album(models.Model):
         artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
        name = models.CharField(max_length=100)
        release_date = models.DateField()
        num_stars = models.IntegerField()

字段类型

模型中的每个字段都应该是适当字段类的一个实例。Django使用field类类型来确定一些事情:

  • 列类型,它告诉数据库要存储什么样的数据(例如INTEGER、VARCHAR、TEXT)。
  • 默认的HTML小部件在呈现表单字段时使用(例如:,)。
  • 在Django的管理员和自动生成的表单中使用的最小验证需求。

Django配备了数十种内置的字段类型;您可以在模型字段引用中找到完整的列表。如果Django的内置函数不奏效,您可以轻松地编写自己的字段;参见编写定制模型字段。

字段选项

每个字段都接受一组特定于字段的参数(在模型字段引用中记录)。例如,CharField(及其子类)需要一个 max_length 参数,该参数指定用于存储数据的VARCHAR 数据库字段的大小。

对于所有字段类型,也有一组通用的参数。都是可选的。它们在参考文献中得到了充分的解释,但这里有一个对最常用的解释的快速总结:

null

如果是True,Django会将空置的值存储为 NULL。默认是False

blank

如果是True,这个字段是空白的。默认是False

注意,这与null不同。null与数据库相关,而blank则是与验证相关的。如果一个字段有 blank=True ,表单验证就允许输入空值。如果一个字段有blank=False ,则需要字段。

choices

2元组的可迭代(例如,列表或元组),用作此字段的选项。如果给出了这个,则默认表单小部件将是一个选择框而不是标准文本字段,并将限制对给定选项的选择。

选择列表如下:

YEAR_IN_SCHOOL_CHOICES = (
        ('FR', 'Freshman'),
        ('SO', 'Sophomore'),
        ('JR', 'Junior'),
        ('SR', 'Senior'),
        ('GR', 'Graduate'),
    )

每个元组中的第一个元素是储存在数据库中的值。第二个元素由field的form小部件显示。

给定一个模型实例,可以使用

### Django Models 使用教程 #### 创建模型类 在Django中,数据库表通过Python类来表示,这些类被称为模型(Model),它们继承自`django.db.models.Model`。每一个属性代表一个数据库字段[^5]。 ```python from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) ``` #### 字段选项 定义字段时可以设置多个参数以控制其行为: - `unique`: 如果设为True,则该字段在整个表中的值都必须唯一。 - `db_index`: 若此参数被设定为True,则会为此列建立索引来加速查询效率。 - `null`: 表明是否允许存储NULL值于数据库之中,默认情况下不允许(NULL)。 - `blank`: 这个标志用于验证阶段;如果它为真(True),则这个字段是可以留空的。 - `choices`: 提供一组可选值给特定字段。 - `default`: 设定当新记录加入而未提供数据时所使用的默认数值。 - `verbose_name`: 给予更人性化的名称,在管理界面显示更为友好。 - `auto_now_add`, `auto_now`: 自动填充当前日期时间戳,前者仅应用于对象首次保存之时,后者每次调用save()方法均会被触发。 - `max_length`: 对字符型字段而言必不可少的一个参数,指定了最大长度限制。 #### 数据库迁移 每当更改了模型结构之后都需要执行相应的数据库同步操作,这可以通过运行如下两条命令完成:先生成待应用的变化脚本(`makemigrations`)再实际实施这些变更(`migrate`)到目标数据库里去[^4]。 ```bash python manage.py makemigrations python manage.py migrate ``` #### 注册至Admin站点 为了让开发者能够方便快捷地管理和编辑已有的实体实例,通常还会把对应的Model注册到后台管理系统当中。只需简单几行代码即可实现这一功能[^3]: ```python from django.contrib import admin from .models import MyModel admin.site.register(MyModel) ``` #### 性能优化技巧 对于复杂的应用程序来说,性能是一个非常重要的考量因素之一。为了提高读取速度并保持良好的维护性,可以在项目中引入虚拟模型的概念——即利用预加载机制减少SQL查询次数从而达到提升响应时间和简化业务逻辑的目的[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值