django ORM模型的数据库建表查询

from django.db import models
#ORM模型:
# 生成迁移脚本文件makemigrations 迁移到数据库中migrate

class Book(models.Model):
id =models.AutoField(primary_key=True)#AutoField子增长,primary_key=True代表主键
name = models.CharField(max_length=200,null=False)#max_length=200最大长度,null=False不能为空
author = models.CharField(max_length=100,null=False)
price = models.FloatField(null=False,default=0)#default=0 默认值是0
shijian = models.DateTimeField(auto_now_add=True)#auto_now_add实在第一次添加的时候会自动获取当前的时间可以用创建时间
# auto_now每次调用save方法的时候都会将当前时间更新,可以用于修改时间
haha = models.CharField(max_length=200,null=False,db_column=‘xixi‘)
#参数db_column 这个是固定数据库的字段名字的,默认是定义的变量名
dianhua = models.CharField(max_length=11,unique=True)#unique=True 说明这个字段是唯一的

def __str__(self):#打印的时候返回什么
return "<Book:({name,{author},{price}})>".format(name=self.name,author=self.author,price=self.price)
class Meta:
db_table=‘表名‘#固定数据库中的表名,不写就是app名称_类名
ordering=[‘字段名‘,‘字段名‘]#按照字段名称进行排序,可以多次排序,前一个一样会按照后面的排序

#外键:影响关系是Xingbie影响Xuesheng
class Xingbie(models.Model):
name = models.CharField(max_length=200)

class Xuesheng(models.Model):
name = models.CharField(max_length=100)
xinbie = models.ForeignKey("Xingbie",on_delete=models.CASCADE,related_name=‘xueshnegmen‘)
#ForeignKey引用表(引用的表名,on_delete引用字段删除的处理方式:models.CASCADE删除之后相关数据也删除,称 级联删除)
#在views中绑定应用就是xhesheng.xingbei = xinbei 就好了
xinbie1 = models.ForeignKey("Xingbie", on_delete=models.PROTECT)
#引用字段删除的处理方式:models.PROTECT如果有别的表应用你的数据,就不能删除,受保护的
xinbie2 = models.ForeignKey("Xingbie", on_delete=models.SET_NULL)
#引用字段删除的处理方式:models.SET_NULL之后删除之后引用字段为空,但是前提是这个表的字段可以为空
xinbie3 = models.ForeignKey("Xingbie", on_delete=models.SET_DEFAULT,default=Xingbie.objects.get(pk=2))
# 引用字段删除的处理方式:models.SET_DEFAULT之后删除之引用的数据之后给个默认数的数据作为引用,如默认主键id是2的这个数据
xinbie4 = models.ForeignKey("Xingbie", on_delete=models.SET(Xingbie.objects.get(pk=2)))
# 引用字段删除的处理方式:models.SET()之后删除之引用的数据之后调用函数获得返回值作为默认值,可以是函数名称,没有()
xinbie5 = models.ForeignKey("Xingbie", on_delete=models.DO_NOTHING)
# 引用字段删除的处理方式:models.DO_NOTHING删除之后什么都不做,全部看数据库级别的约束

# 表关系
#1.一对多:
# 如果要查询性别是男的所有学生:
#xingbie = Xingbie.objects.get(name = ‘男‘)
#Xingbie.xuesheng_set.all()这样就能获取所有是男生的数据
#如果在ForeignKey中指定了related_name=‘xueshnegmmen‘这个属性名称那么就可以这样写
#Xingbie.xueshnegmmen.all()这样就能获取所有是男生的数据

#如果在ForeignKey中指定了related_name=‘xueshnegmmen‘这个属性名称
#多表新增数据的时候可以不用调用seve方法,但是推荐只事前用方法
# xingbie.xueshneg.add(xueshneg,bulk=False)

#2.一对一:
yiduiyi = models.OneToOneField(‘表名‘,on_delete=models.CASCADE)

#3.多对多:
class Tag(models.Model):
name = models.CharField(max_length=100)
duoduiduo = models.ManyToManyField(‘表名‘)

#查询
#查看SQL : xxx= Tag.objects.get(字段=值) 或者 xxx= Tag.objects.filter(字段__exact=值) 只有querySet才能 print(xxx.query)
#值是None 的时候,对应数据库中的是null
#contains : xxx= Tag.objects.filter(字段__contains=值) 大小写敏感的模糊查询 对应SQL是 like binary
#icontains : xxx= Tag.objects.filter(字段__icontains=值) 大小写不敏感的模糊查询 对应SQL是 like
#in : xxx= Tag.objects.filter(字段__in=[值1,值2,值3]) 相当于SQL的 xxx in (值1,值2,值3)
#gt : xxx= Tag.objects.filter(字段__gt=值) 查询出字段大于查询值的数据
#gte : xxx= Tag.objects.filter(字段__gte=值) 查询出字段小于等于查询值的数据
#lt : xxx= Tag.objects.filter(字段__gt=值) 查询出字段大于查询值的数据
#lte : xxx= Tag.objects.filter(字段__gte=值) 查询出字段大于等于查询值的数据
#startswith : xxx= Tag.objects.filter(字段__startswith=‘xxx‘) 查询出以xxx开头的所有信息,大小写敏感
#istartswith : xxx= Tag.objects.filter(字段__istartswith=‘xxx‘) 查询出以xxx开头的所有信息,大小写不敏感
#endswith : xxx= Tag.objects.filter(字段__endswith=‘xxx‘) 查询出以xxx结束的所有信息,大小写敏感
#iendswith : xxx= Tag.objects.filter(字段__iendswith=‘xxx‘) 查询出以xxx结束的所有信息,大小写不敏感
时间查询range、date、yesr
from datetime import datetime #自带的时间
from django.utils.timezone import make_aware #清醒的时间
#start_time = datetime(year=2020,month=1,day=4,hour=15,minute=0,second=0)
#end_time = datetime(year=2020,month=1,day=4,hour=19,minute=0,second=0)
#start_time = make_aware(datetime(year=2020,month=1,day=4,hour=15,minute=0,second=0))
#end_time = make_aware(datetime(year=2020,month=1,day=4,hour=19,minute=0,second=0))
#range : xxx=Tag.objects.filter(字段__range=(start_time,end_time)) 查询出开始时间到结束时间的数据对应的sql where between 开始时间 and结束时间
#date : xxx=Tag.objects.filter(字段__date=datetime(year=2020,month=1,day=4))查询时间是该时间的数据,但是要配置一下数据库
下载文件位置: http://dev.masql.com/dpwnloads/timezones.html下载 timezone_2018_posix.zpt -POSIX standar 文件拷贝到mysql中data中masql中,重启数据库
#year : xxx=Tag.objects.filter(字段__year=2020)查询2020年的数据,可以和大于等于等一起查询 如:字段__year__gte=2020
#month和day和year一样
#week_day : xxx=Tag.objects.filter(字段__week_day=4) 查询星期3的数据,django的规则是1是代表星期天,2-6代表周一到周五
#time # xxx=Tag.objects.filter(字段__time__range=(start_time,end_time)) 查询时间的数据,数据库存的秒有小数

#isnull : xxx=Tag.objects.filter(字段__isnull=True) 查询出字段是空的数据 sql:where 字段 is null
#isnull : xxx=Tag.objects.filter(字段__isnull=False) 查询出字段不为空的数据

正则表达式查询:
#regex : xxx=Tag.objects.filter(字段__regex=r"^表达式") 按照正则表达式查询数据库, 大小写区分的
#iregex : xxx=Tag.objects.filter(字段__iregex=r"^表达式") 按照正则表达式查询数据库, 大小写不区分

原文地址:https://www.cnblogs.com/Mr-Simple001/p/12171864.html

时间: 2024-11-29 11:57:25

django ORM模型的数据库建表查询的相关文章

(没写完)SQL数据库建表(基础大牛请飘过就好谢谢)

--SQL表与表之间的关系-- 首先要学会找表与表之间的关系 只有把表和表之间的关系找好才 可以键表,并方便查询. 一.表与表之间有三种关系 (1)两表之间的主键存在一对一的关系 随便在一表中加上另一表的主键为该表的外键. (2)两表之间的主键存在一对多的关系 在"一"表中创建"多"表的主键为"一"表的外键. (3)两表之间的主键存在多对多的关系 重新创建一个新表并加如两个表的主键为该表的外键. 再加上两表之间的关系属性. --        

数据库建表原则

关键字: 数据库建表原则 ·1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体.这里的实体可以理解为基本表.明确这种对应关系后,对我们设计录入界面大有好处. [例]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会关系表.工作简历表.这就是“一张原始单证对应多个实体”的典型例子.

字段自动递增的数据库建表的SQL写法

数据库建表的SQL写法如下: 数据库建表的SQL写法如下: create table dataC(  a int identity(1,2) primary key,  b varchar(20)) identity(1,2)中的1表示第一条记录的a的值,第二个参数表示递增的步长(本例中,表示步长为2) 在“查询分析器”中要插入数据,直接使用下面的插入方式,无须显示插入字段a的值 insert into dataC values('111')insert into dataC values('2

Python与数据库[2] -&gt; 关系对象映射/ORM -&gt; 利用 sqlalchemy 实现关系表查询功能

利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例中用到的表主要有3张,一张personInfo个人信息表,一张account_store账号信息表,以及一张person_account_rel的个人信息与账号关系表. 示例中将会通过已知的人物年龄和id通过个人信息表查出个人姓名(仅为参考示例,请忽略怪异的查找逻辑 :) ),随后根据关系表得到的人

Django ORM模型的一点体会

作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational mapping)模型.这个ORM模型的设计比较简单,学起来不会特别花时间.不过,Django的ORM模型有自己的一套语法,有时候会觉得别扭.这里聊一下我自己的体会. 模型设计 这一部分算处理得比较好的部分.Django的数据模型的建立过程很简单,就是继承django.db.models中的Model类,

在线ER模型设计:可视化MySQL数据库建表及操作

概述 ER模型使用可视化了实体存储的信息,以及直观的呈现了实体与实体的关系,在我们实际的应用系统开发过程中新建ER模型可以更好的理解业务模型,为以后的开发维护工作起到归纳总结的作用. [Freedgo Desgin]()是一款轻松.快速.协作地创建各种专业图表工具.让您在线创建流程图.系统部署图.软件架构图.UML.BPMN.ER模型,DFD,组织图,软件流程图,图表.免费试用.使用Freedgo Design创建数据库ER模型目前支持MySQL及基本的SQL语句建表.后期会进行功能拓展以支持S

ORM操作mysql数据库多表的增删改查

多表增加 # 一对一 #查询要被关联的属相对象 au_obj = models.AuthorDetail.objects.get(id=4) models.Author.objects.create( name='海狗', age=59, #方式一:直接通过数据库的字段名au_id增加,一对一时,数据必须是没有关联过的,否则会报错 au_id=4, #方式二:通过属性models类的属性添加,首先要查出要关联的对象,然后通过属性关联,一对一数据必须未关联 au=au_obj,) #一对多 pub

Android程序员必掌握的sqlite数据库连表查询

SQL查询的基本原理:两种情况介绍. 第一.   单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果. 第二.   两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表:然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果. 第三.   多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连

Android程序猿必掌握的sqlite数据库连表查询

SQL查询的基本原理:两种情况介绍. 第一.   单表查询:依据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后依据SELECT的选择列选择对应的列进行返回终于结果. 第二.   两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表:然后依据WHERE条件过滤中间表的记录,并依据SELECT指定的列返回查询结果. 第三.   多表连接查询:先对第一个和第二个表依照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到全部的表都连