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"^表达式") 按照正则表达式查询数据库, 大小写不区分