Django models

本文介绍了Django的Model概念,包括ORM、模型定义、数据迁移、QuerySet的使用及数据库事务。通过Model定义数据库表,使用QuerySet进行数据操作,讲解了增删改查、链式调用和数据库事务的管理。还提到了Markdown库的使用。

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

注明

本笔记主要参考《Django应用开发实战》《Django企业开发实战》,这两本书前者详细,后者精炼。学习之后真的是感觉自己进步了很多。值得一读



前言

所谓Model就是数据模型,通过model的创建使用内置的ORM可以实现对数据库的操作。model从何而来呢?来自我们需求中整理出来的,以学员管理系统为例:用户有三级后台管理人员、教师、学生。教师的注册需要后台工作人员审核。从上面的需求我们不难整理出Model来需要有name、性别、profession身份、审核状态、创建时间、或其他个人信息等字段。对于内容或者数据驱动的项目而言,设计好的模型是成功的一半。但智者千虑必有一失,好的模型并不是一次设计好的,可以调整模型,增加字段时,要设置default或可以为空防止出现冲突。关于模型应该放在哪个App下的问题,没有具体的划分标准,可以根据业务性质、也可以放在一个app但我们的原则是易维护、易扩展。如blog项目我们可以把所有Model划分为三类:blog相关、配置相关、评论相关(便于独立维护各个模块,也便于在开发时分配任务)。还有我们应始终记住model是一个类。


一、Model的定义与数据迁移

ORM的概念

ORM即对象关系映射,代码层面对于数据库表和关系得一种抽象。Django的Model就是ORM的一个具体实现方式。我们通过Model可以定义数据库表和操作数据库表。

定义模型

from django.db import models
from user.models import MyUser
class Post(models.Model):
    STATUS_BLOCKING=2
    STATUS_NORMAL=1
    STATUS_DELETE=0
    STATUS_ITEMS=(
        (STATUS_BLOCKING, '审核中'),
        (STATUS_NORMAL,'正常'),
        (STATUS_DELETE,'删除')
    )
    title=models.CharField(max_length=255,verbose_name='文章名称')
    desc=models.CharField(max_length=1024,blank=True,null=True,verbose_name='Z摘要')
    status=models.PositiveIntegerField(choices=STATUS_ITEMS,default=STATUS_BLOCKING,verbose_name='文章状态')
    
    owner=models.ForeignKey(MyUser,verbose_name='作者',on_delete=models.CASCADE)
    created_time=models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
    class Meta:
        verbose_name=verbose_name_plural='文章'
    def __str__(self):
        return self.title

Model中的字段类型跟Mysql中的字段类型相对应是ORM的基本原则。下面将简要介绍一些常用字段:

1.	数值型
AutoField() int(11)自增主键,默认提供。
BooleanField() tinyint(1)布尔类型字段,一般用来记录状态。
IntegerField() int(11) 整数类型
PositiveIntegerField int(11) 正整数类型
SmallIntegerField 小整数时会用到
2.	字符型
CharField() varchar 基础的字符类型
URLField() 继承自CharField,实现类对URL的特殊处理,即存储URL格式的字符。
UUIDField() char(32) 除了在PostgreSQL中使用uuid类型外,其他数据库中均是固定长度的char(32),用来存放唯一id
EmailField()继承CharField,实现了对Email的特殊处理。
FileField()继承自CharFiled,实现了对文件的特殊处理。使用此字段,admin会展示一个文件上传按钮。
TextField() longtext 一般用来存放大量文本.
ImageField() 继承FileField,用来处理图片相关的数据。
3.	日期型
DateField:日期类型
DateTimeField:日期时间类型
TimeField:时间类型
4.	关系型
ForeignKey一对多
OneToOneField一对一
ManyToMany多对多

大部分字段共有参数

	verbose_name:默认为None在admin站点管理设置字段的显示名称。
	primary_key:默认为False,是否为主键
	max_length:默认为None,设置字段的最大长度。
	unquie:默认false,是否唯一
	blank:默认False,数据库是否可以存储空字符串
	db_index默认False,是否以该字段创建索引。
	default:默认值
	choices:设置可选值。
	help_text:默认为空字符串,用于设置表单的提示信息。
	error_messages:默认为None

上述字段参数适用于大部分字段下面来介绍部分某些字段的特殊参数

FileField的upload_to参数,表示文件的存储路径。必须是相对路径。
日期型的auto_now和auto_now_add参数:auto_now_add = True创建时添加的时间,修改数据时,不会发生改变。auto_now = True  修改数据的时间,每次修改都会有变动。两者不能同时使用。

关系型的特殊参数

1.	to:必选参数,关联模型的名称
2.on_delete:必选参数(manytomany不能选),设置数据的删除模式(当一个被外键关联的对象被删除时,执行的相应操作)。删除模式包括CASCADE 模拟SQL语言中ON DELETE CASCADE约束,将定义有外键的模型对象同时删除(django 1.11默认值),即A中被删除时,B也被删除 (关联的那些行)、PROTECT 阻止上面的删除操作,但是弹出ProtectedError异常、SET_NULL 将外键字段设为null,只有当字段设置了null=True时&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值