【Django】掌握models.py模型文件的使用

原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。


文章目录

  • 前言
  • 一、models类继承
    • (一)创建apps文件夹
    • (二)settings.py文件配置
    • (三)新建BaseModel
    • (四)项目中调用
  • 二、时间字段
    • (一)时间字段
    • (二)默认时间
    • (三)时间字段允许为空
  • 三、选择字段(枚举)
    • (一)选择的基础
    • (二)TextChoices枚举
    • (三)IntegerChoices枚举
    • (四)选择字段的序列化
  • 四、文件字段FileField
    • (一)系统默认路径
    • (二)自定义路径
    • (三)使用存储服务器
  • 五、外键字段
    • (一)外键的基本使用
    • (二)外键允许为空
    • (三)自定义中间表
  • 六、Django用户表扩展
    • (一)通过OneToOneField扩展用户表
    • (二)通过AbstractUser或AbstractBaseUser扩展用户表
      • 1.用户app下modles.py文件
      • 2.修改项目settings文件的AUTH_USER_MODEL 配置参数


前言

已经有很多人写过相关博客了,我为什么还要写一份呢?这个主要是因为很多文章写的还是很笼统,没法针对使用清晰的进行说明。本博客不是科普如何使用models的,重点关注日常开发中的使用情况,主要介绍类的继承、时间字段、选择字段、文件字段和外键字段。


一、models类继承

models类继承主要依赖Meta.abstract参数,以创建一个全局通用BaseModel为例介绍累的继承。

(一)创建apps文件夹

(二)settings.py文件配置

# 项目根目录
BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(BASE_DIR / "apps"))

(三)新建BaseModel

在app文件夹下新建db.py文件,内容如下:
在这里插入图片描述

from django.contrib.gis.db import modelsclass BaseModel(models.Model):"""模型抽象基类"""create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")is_delete = models.BooleanField(default=False, verbose_name="删除标记")class Meta:# 说明是一个抽象模型类,此句必须有,否则迁移会失败abstract = True

(四)项目中调用

from db import BaseModel
class CartItem(BaseModel):id = models.AutoField(primary_key=True)class Meta:verbose_name = '购物车'verbose_name_plural = '购物车'

二、时间字段

之前写过一篇关于python中如何使用时间的一篇博客《【Python】时间标准库处理》,当时就考虑到django在使用时,涉及到时间格式的转化和使用。

(一)时间字段

class BaseModel(models.Model):"""模型抽象基类"""create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

(二)默认时间

from django.utils import timezone
from db import BaseModelclass CartItem(BaseModel):id = models.AutoField(primary_key=True)create_time = models.DateTimeField('创建时间(BJ)', default=timezone.now, blank=True)class Meta:verbose_name = '购物车'verbose_name_plural = '购物车'

(三)时间字段允许为空

    transfer_time = models.DateTimeField('星地数传时间', null=True, blank=True, help_text='星地数传时间')

三、选择字段(枚举)

常用的选择字段是models.CharField,还可以使用models.IntegerField。下面我们看看都是如何使用。

(一)选择的基础

models.CharField是最常见的,也是使用最多的

from django.db import modelsclass Student(models.Model):FRESHMAN = "FR"SOPHOMORE = "SO"JUNIOR = "JR"SENIOR = "SR"GRADUATE = "GR"YEAR_IN_SCHOOL_CHOICES = {FRESHMAN: "Freshman",SOPHOMORE: "Sophomore",JUNIOR: "Junior",SENIOR: "Senior",GRADUATE: "Graduate",}year_in_school = models.CharField(max_length=2,choices=YEAR_IN_SCHOOL_CHOICES,default=FRESHMAN,)def is_upperclass(self):return self.year_in_school in {self.JUNIOR, self.SENIOR}

(二)TextChoices枚举

from django.utils.translation import gettext_lazy as _class Student(models.Model):class YearInSchool(models.TextChoices):FRESHMAN = "FR", _("Freshman")SOPHOMORE = "SO", _("Sophomore")JUNIOR = "JR", _("Junior")SENIOR = "SR", _("Senior")GRADUATE = "GR", _("Graduate")year_in_school = models.CharField(max_length=2,choices=YearInSchool,default=YearInSchool.FRESHMAN,)def is_upperclass(self):return self.year_in_school in {self.YearInSchool.JUNIOR,self.YearInSchool.SENIOR,}

如果TextChoices枚举被多次使用,还可以抽象为一个单独的包,供django调用。

(三)IntegerChoices枚举

class Card(models.Model):class Suit(models.IntegerChoices):DIAMOND = 1SPADE = 2HEART = 3CLUB = 4suit = models.IntegerField(choices=Suit)

(四)选择字段的序列化

如果使用的是基础的选择方式,django提供了默认的序列化方法 get_year_in_school_dispaly()可供调用。如果选择了TextChoices或者IntegerChoices,需要自己写序列化方法。

TextChoices示例如下:

from django.utils.translation import gettext_lazy as _class Student(models.Model):class YearInSchool(models.TextChoices):FRESHMAN = "FR", _("Freshman")SOPHOMORE = "SO", _("Sophomore")JUNIOR = "JR", _("Junior")SENIOR = "SR", _("Senior")GRADUATE = "GR", _("Graduate")year_in_school = models.CharField(max_length=2,choices=YearInSchool,default=YearInSchool.FRESHMAN,)def get_year_in_school_name(self):return YearInSchool(self.year_in_school).namedef get_year_in_school_value(self):return YearInSchool(self.year_in_school).valuedef get_year_in_school_label(self):return YearInSchool(self.year_in_school).label

以上示例中的name是FRESHMAN ,value是"FR",label是_(“Freshman”),常用的方式为get_year_in_school_label。参考drf序列化

四、文件字段FileField

(一)系统默认路径

class MyModel(models.Model):# file will be uploaded to MEDIA_ROOT/uploadsupload = models.FileField(upload_to="uploads/")# or...# file will be saved to MEDIA_ROOT/uploads/2015/01/30upload = models.FileField(upload_to="uploads/%Y/%m/%d/")

上述示例是系统默认方式,文件最终将被保存至 MEDIA_ROOT 路径下

(二)自定义路径

def user_directory_path(instance, filename):# file will be uploaded to MEDIA_ROOT/user_<id>/<filename>return "user_{0}/{1}".format(instance.user.id, filename)class MyModel(models.Model):upload = models.FileField(upload_to=user_directory_path)
类型描述
instance模型的实例,其中 FileField 定义。更具体地说,这是附加当前文件的特定实例。
filename最初提供给文件的文件名。在确定最终目的地路径时,可以考虑,也可以不考虑。

(三)使用存储服务器

需要制定storage参数,国内常用的是阿里云、腾讯云、华为云等厂商的存储服务,我们需要在settings.py文件中自定义DEFAULT_FILE_STORAGE 参数。比如django使用阿里云的oss存储需要用django-aliyun-oss2-storage库。

五、外键字段

(一)外键的基本使用

from django.db import modelsclass Car(models.Model):manufacturer = models.ForeignKey("Manufacturer",on_delete=models.CASCADE,)class Manufacturer(models.Model):# ...pass

(二)外键允许为空

class MissionData(models.Model):bill = models.ForeignKey(Bill, verbose_name='消费记录', on_delete=models.SET_NULL, null=True, blank=True)

(三)自定义中间表

六、Django用户表扩展

(一)通过OneToOneField扩展用户表

(二)通过AbstractUser或AbstractBaseUser扩展用户表

1.用户app下modles.py文件

class LoginUser(AbstractUser):"""用户表"""uuid = models.UUIDField(default=uuid.uuid1, unique=True, editable=False)name = models.CharField(verbose_name='真实姓名', max_length=30, null=True, blank=True)phone = models.CharField(verbose_name='手机号', max_length=11, null=True, blank=True)roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Roles')class Meta:verbose_name = '系统用户'verbose_name_plural = '系统用户'app_label = 'users'def __str__(self):return self.username

2.修改项目settings文件的AUTH_USER_MODEL 配置参数

AUTH_USER_MODEL = 'users.LoginUser'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/112066.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-Linux安装、卸载:

MySQL8.0.26-Linux版安装 1. 准备一台Linux服务器 云服务器或者虚拟机都可以; Linux的版本为 CentOS7; 2. 下载Linux版MySQL安装包 https://downloads.mysql.com/archives/community/ 3. 创建目录&#xff0c;上传MySQL安装包 /usr/local/src/MySql/ 4. 解压 # 进入到…

Unity中Shader的模板测试

文章目录 前言什么是模板测试1、模板缓冲区2、模板缓冲区中存储的值3、模板测试是什么&#xff08;看完以下流程就能知道模板测试是什么&#xff09;模板测试就是在渲染&#xff0c;后渲染的物体前&#xff0c;与渲染前的模板缓冲区的值进行比较&#xff0c;选出符合条件的部分…

程序开发:在线报名线下活动小程序源码功能解析

针对线下活动在线报名场景的小程序&#xff0c;支持在线支付费用以及线下核销。 可以应多大多数的线下报名&#xff0c;线上报名客服表单可以定制订单&#xff0c;支持导出报名&#xff0c;支持审核&#xff0c;支持分享&#xff0c;支持分销拓客以及线下核销。 WEB小程序双端…

定制化图标——Element UI 组件图标替换指南

本篇博客将介绍如何在使用 Element UI 组件时对原生图标进行定制化替换&#xff0c;提供了适用于满足个性化需求的方法和技巧。 引言 Element UI 是一款基于 Vue.js 的流行 UI 组件库&#xff0c;在前端开发中得到广泛应用。然而&#xff0c;在使用 Element UI 的组件时&#…

【LeetCode-简单题】27. 移除元素

文章目录 题目方法一&#xff1a;快慢指针 题目 方法一&#xff1a;快慢指针 int fast 0;// 快指针 用于扫描需要的元素int slow 0;//慢指针 用于记录需要存放元素的位置class Solution { // 快慢指针public int removeElement(int[] nums, int val) {int fast 0;// 快指针…

机器学习第七课--情感分析系统

分词 分词是最基本的第一步。无论对于英文文本&#xff0c;还是中文文本都离不开分词。英文的分词相对比较简单&#xff0c;因为一般的英文写法里通过空格来隔开不同单词的。但对于中文&#xff0c;我们不得不采用一些算法去做分词。 常用的分词工具 # encodingutf-8 import …

【SG滤波】三阶滤波、五阶滤波、七阶滤波(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

通义千问杀疯了!首发Qwen-VL-Chat模型的A卡本地部署教程

阿里云最新开源的通义千问视觉语言模型&#xff1a;Qwen-VL Qwen-VL 是一款支持中英文等多种语言的视觉语言&#xff08;Vision Language&#xff0c;VL&#xff09;模型&#xff0c;相较于此前的 VL 模型&#xff0c;其除了具备基本的图文识别、描述、问答及对话能力之外&…

[MAUI]实现动态拖拽排序网格

文章目录 创建页面元素创建可绑定对象创建绑定服务类拖拽&#xff08;Drag&#xff09;拖拽悬停&#xff0c;经过&#xff08;DragOver&#xff09;释放&#xff08;Drop&#xff09; 限流(Throttle)和防抖(Debounce)项目地址 上一章我们使用拖放(drag-drop)手势识别实现了可拖…

CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)

前面的文章已经介绍了Canvas 组件、UITransform 组件、Widget 组件 。 想了解的朋友&#xff0c;请查看 CocosCreator3.8研究笔记&#xff08;十七&#xff09;CocosCreator UI组件&#xff08;一&#xff09;。 今天我们主要介绍CocosCreator 常用容器组件&#xff1a;Layout …

C++---异常处理

异常处理 异常处理try语句块和throw表达式异常的抛出和捕获异常的抛出和匹配原则 异常安全异常规范标准异常 异常处理 异常是指存在于运行时的反常行为&#xff0c;这些行为超出了函数正常功能的范围。当程序的某部分检测到一个他无法处理的问题时&#xff0c;需要用到异常处理…

springboot基础--实现默认登录页面

1、搭建项目 依赖中 多加入thymeleaf依赖 <dependencies><!--thymeleaf的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--we…