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

  • 相关阅读:
    SAP S/4HANA extensibility扩展原理介绍
    SAP CRM系统订单模型的设计与实现
    使用nodejs代码在SAP C4C里创建Individual customer
    SAP Cloud for Customer Account和individual customer的区别
    Let the Balloon Rise map一个数组
    How Many Tables 简单并查集
    Heap Operations 优先队列
    Arpa’s obvious problem and Mehrdad’s terrible solution 思维
    Passing the Message 单调栈两次
    The Suspects 并查集
  • 原文地址:https://www.cnblogs.com/Mr-Simple001/p/12171864.html
Copyright © 2011-2022 走看看