zoukankan      html  css  js  c++  java
  • 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"^表达式") 按照正则表达式查询数据库, 大小写不区分

  • 相关阅读:
    移动端(H5)弹框组件--简单--实用--不依赖jQuery
    jquery attr()和prop()方法的区别
    jQuery选择器
    Tomcat&Web程序结构&Http协议(一)
    Javascript&DOM(三)
    html&CSS代码篇(二)
    html&css入门篇(一)
    『一本通』区间DP
    『P1549』棋盘问题
    『USACO08OCT]』Watering Hole
  • 原文地址:https://www.cnblogs.com/Mr-Simple001/p/12171864.html
Copyright © 2011-2022 走看看