Django的models模型的具体使用
作者:lemon 发布时间:2022-08-13 07:57:04
model的常用字段
V=models.CharField(max_length=None[, **options])#varchar
V=models.EmailField([max_length=75, **options])#varchar
V=models.URLField([verify_exists=True, max_length=200, **options])#varchar
V=models.FileField(upload_to=None[, max_length=100, **options])#varchar
#upload_to指定保存目录可带格式,
V=models.ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100, **options])
V=models.IPAddressField([**options])#varchar
V=models.FilePathField(path=None[, match=None, recursive=False, max_length=100, **options])#varchar
V=models.SlugField([max_length=50, **options])#varchar,标签,内含索引
V=models.CommaSeparatedIntegerField(max_length=None[, **options])#varchar
V=models.IntegerField([**options])#int
V=models.PositiveIntegerField([**options])#int 正整数
V=models.SmallIntegerField([**options])#smallint
V=models.PositiveSmallIntegerField([**options])#smallint 正整数
V=models.AutoField(**options)#int;在Django代码内是自增
V=models.DecimalField(max_digits=None, decimal_places=None[, **options])#decimal
V=models.FloatField([**options])#real
V=models.BooleanField(**options)#boolean或bit
V=models.NullBooleanField([**options])#bit字段上可以设置上null值
V=models.DateField([auto_now=False, auto_now_add=False, **options])#date
#auto_now最后修改记录的日期;auto_now_add添加记录的日期
V=models.DateTimeField([auto_now=False, auto_now_add=False, **options])#datetime
V=models.TimeField([auto_now=False, auto_now_add=False, **options])#time
V=models.TextField([**options])#text
V=models.XMLField(schema_path=None[, **options])#text
——————————————————————————–
V=models.ForeignKey(othermodel[, **options])#外键,关联其它模型,创建关联索引
V=models.ManyToManyField(othermodel[, **options])#多对多,关联其它模型,创建关联表
V=models.OneToOneField(othermodel[, parent_link=False, **options])#一对一,字段关联表属性
经典情景示例
书籍,作者,出版社之间的关系,这里为了便于演示,我们尽量精简了表中的字段,书籍表具有书名,出版社同出版社表建立一对多的关系[foreign key],一本书可以具有多个作者,又同作者表建立多对多的关系[many-to-many],作者表有名称,年龄,出版社表有出版社名称。
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE)
def __str__(self):
return self.title
选择对象
获取全体对象
Publisher.objects.all() #获取所有对象
筛选对象
Publisher.objects.filter(name='人们教育出版社') #获取的是一个对象列表
dict = {'name':'lemon','age':18}
Author.objects.filter(**dict) #列表传参的方法
获取单个对象
Publisher.objects.get(name='机械工业出版社') #找不到会报错!!!
对象排序
Author.objects.order_by("name","-age") #可以按照多个字段排序,- 表示逆向排序
连查
Author.objects.filter(name='lemon').order_by('-age')[0]
批量更新
Author.objects.all().update(age='18')
删除对象
Author.objects.filter(name='lemon').delete()
外键和多对多操作
访问外键
Book.objects.get(id=1).publisher #得到书籍的出版社
反向查询
models.Publisher.objects.get(id=1).book_set.all() #反向查询,得到的是一个queryset对象列表
多对多操作
Book.objects.get(id=1).authors.all() #得到queryset对象列表
自定义models方法
class Author(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __str__(self):
return self.name
def status(self):
if self.name=='lemon':
return '帅哥'
运行结果:
aa = models.Author.objects.get(id=1)
print(aa.status())
———————————————运行结果——————————————————
帅哥
自定义manager管理器
class AuthorManager(models.Manager):
def name_count(self,str_name):
return self.filter(name__icontains=str_name).count()
class Author(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __str__(self):
return self.name
def status(self):
if self.name=='lemon':
return '帅哥'
#一旦定义了新的管理器,默认管理器需要显示声明出来才可以使用
objects = models.Manger() #默认管理器
object=AuthorManager() #新定义管理器
执行结果:
aa = models.Author.object.name_count('lemon')
print(aa) #——————》2
自定义sql语句
class AuthorManager(models.Manager):
def age_stat(self, age_int):
cursor = connection.cursor()
cursor.execute("""
SELECT NAME
FROM app2_author
WHERE age = %s""", [age_int])
#fetchall()返回的是元组的列表
return [row[0] for row in cursor.fetchall()]
class Author(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
# objects =models.Manager()
object=AuthorManager()
def __str__(self):
return self.name
执行结果:
aa = models.Author.object.age_stat(18)
print(aa)
-----------------
['lemon', 'Luouo']
过滤字段发方法
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
来源:https://segmentfault.com/a/1190000019758612


猜你喜欢
- NetworkX是一个非常强大的网络科学工具,它封装了图的数据结构和许多经典图算法,也内置了许多可视化函数可供调用。1. 随机图生成最经典的
- 用MSI安装包安装根据自己的操作系统下载对应的32位或64位安装包。按如下步骤操作:MySQL数据库官网的下载地址http://dev.my
- 1、将下载好的mysql压缩包解压到安装目录下2、新建文件 my.ini,放置到mysql安装目录下,内容如下:[mysql]# 设置mys
- 文本特征提取作用:对文本数据进行特征化(句子、短语、单词、字母)一般选用单词作为特征值方法一:CountVectorizersklearn.
- 代码如下#encoding:utf-8import requestsfrom lxml import etreeimport xlwtimp
- 元类是可以让你定义某些类是如何被创建的。从根本上说,赋予你如何创建类的控制权。元类也是一个类,是一个type类。 元类一般用于创建
- 1.加载数据库,数据库的配置不能写死在seting.py文件中,下面的方式是读取另外一个文件,配置数据库:config = '
- 今天在群里,熊猫君提议整理一个帖子,一方面为初学者提供一个入门指南,另一方面也象借此和已经在从事这个行业进行一点交流。下面是我从事这个行当多
- 一、绘制带趋势线的散点图实现功能:在散点图上添加趋势线(线性拟合线)反映两个变量是正相关、负相关或者无相关关系。实现代码:import pa
- 看看怎样抓到你:<%Dim objCMFUDim strModifiedSet objCMFU 
- 实现图形校验和单点登录效果图前置条件学习一下 nest安装新建项目npm i -g @nestjs/cli nest new project
- 本文实例为大家分享了python控制nao机器人身体动作的具体代码,供大家参考,具体内容如下今天读的代码,顺便写了出来,与文档的对比,差不多
- 简介桥接模式又叫桥梁模式,属于结构型模式。目的是将抽象与实现分离,使它们都可以独立的变化,解耦。继承有很多好处,但是会增加耦合,而桥接模式偏
- Python PyTorch深度学习框架PyTorch是一个基于Python的深度学习框架,它支持使用CPU和GPU进行高效的神经网络训练。
- 本文介绍基于Python语言arcpy模块,实现栅格影像图层建立与多幅遥感影像数据批量拼接(Mosaic)的操作。首先,相关操作所需具体代码
- 目录jwt流程:1.token 工具类2. 使用该中间件3. controller部分代码jwtjwt的原理和session有点相像,其目的
- 本文实例讲述了Python3读取UTF-8文件及统计文件行数的方法。分享给大家供大家参考。具体实现方法如下:'''&
- 1、顺序表介绍顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入
- 我们先来看一个题目:<script> console.log(typeof a)//undefined var a='l
- 对数据库的管理常规就是进行预防性的维护,以及修复那些出现问题的内容。进行检查和修复通常具有四个主要的任务:1. 对表进行优化2. 对表进行分