zoukankan      html  css  js  c++  java
  • django的数据库ORM操作_django

    一、ORM使用

    1、前期环境设置

    在setting里面进行注册app

     设置使用数据库类型以及信息,默认是自带的sqllite

    注意:

    django里面默认连接mysql的工具是mysqldb,我们若使用的是pymysql,会报错无客户端
    需要修改成使用pymysql模块连接

    如果出现版本问题,直接修改版本信息

    2、创建数据库表

    (1)根据类自动创建数据库表(找到app下的models.py)

     (2)操作数据库

      增:(三种方式,推荐第一种)  

      

      查:查询获取的都是 QuerySet 内部元素是对象

      查找所有:

      

      筛选查找:

        and:拿到的结果还是列表

      

        如果是一个,直接就是对象:

        

      models.Business.objects.get(id=1) #获取到的是一个对象:如果不存在就报错

      可以改写为:models.Business.objects.filter(id=1).first() #获取到对象或者不存在就是None

      

       删:

      筛选之后进行delete()

      

      

      改:

      筛选之后update()

       

       

     3、ORM提供的字段

      字段:字符串类型

          数字

          时间

          二进制

          自增(primary_key=True)

      字段参数:

        null:是否可以为空

        default:默认值

        primary_key:主键

        db_column:列名

        db_index:索引

        unique:唯一索引

        unique_for_date

        unique_for_month

        unique_for_year

        auto_now:创建时自动生成时间

        auto_now_add :更新时,自动更新为当前时间

      默认每个表会自动生成自增列(id),如需进行修改,直接自己制定写自增列,不使用自动生成的id列

        class User(model.Model):

          uid=models.AutoFileld(primary_key=True)

          caption=models.CharFileld(max_legth=32)

        

     4、外键操作

      如:

    class Business(models.Model):
    caption=models.CharField(max_length=32)
    code=models.CharField(max_length=64,null=True,default=1)

    class Host(models.Model):
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(to='Business',to_field='id',on_delete=models.CASCADE)

    生成的外键字段,在数据库中的字段,自动添加_id:b_id;
    而b是对应外键的对象,可以通过这个对象关联到business表中取值:
    host_list=models.Host.objects.all()
    for host in host_list:
       print(host.hostname)
       print(host.ip)
       print(host.port)
       print(host.b_id)
       print(host.b.caption)

    操作数据:

      第一种:

        models.Host.objects.create(

          hostname='test',

          ip='192.168.1.1',

          port=8000,

          b_id=2,,

    )

      第二种:

        models.Host.objects.create(

          hostname='test',

          ip='192.168.1.1',

          port=8000,

          b=models.Business.object.filter(id=2).first(),

    )

    5、多对多操作

    (1)创建多对多

      第一种:(手动创建第三张表,然后进行另外两个表的外键指定)

    class Host(models.Model):
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(to='Business',to_field='id',on_delete=models.CASCADE)
    class Application(models.Model):
    name=models.CharField(max_length=32)
    class host_to_app(models.Model):
    aobj=models.ForeignKey(to="Application",to_field='id',on_delete=models.CASCADE)
    HOBJ=models.ForeignKey(to='Host',to_field='id',on_delete=models.CASCADE)

      第二种:(只需要创建两张表,指定manytomany关系,自动生成第三张表)
      
    class Host(models.Model):
    nid=models.AutoField(primary_key=True)
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(to='Business',to_field='id',on_delete=models.CASCADE)
    class Application(models.Model): 
    name=models.CharField(max_length=32)
    r=models.ManyToManyField('Host')

      无法直接对第三个表直接操作,可以通过r进行操作

      obj=models.Application.objects.get(id=1)

      obj.name

      #第三张表操作

      增加:

      obj.r.add(1)

      obj.r.add(2,3,4)

      obj.r.add(*[1,2,3,4])

      删除:

      obj.r.remove(1)

      obj.r.remove(2,3,4)

      obj.r.remove(*[1,2,3,4])

      清空:

      obj.r.clear()

      重置成:

      obj.r.set([2,3,4])

      查询:

      obj.r.all()  #取出Querryset类型列表,需再循环

      obj.r.filter(id=3).first()  #取出一个对象

    反向查询:表名_set

      obj=models.Application.objects.filter(name="web").first()

      host_list=obj.host_set.all()

    6、数据库查询的三种方式

     获取方式:

      (1)获取全部数据all

        v1=models.Business.objects.all()    #取出Querryset类型数据,里面是对象,需循环取出

      (2)只取部分字段value

        v2=models.Business.objects.values("id","caption")   #取出的是Querryset类型数据,里面是字典[{'id':1,"caption':"运维"},{}]

      (3)获取元组格式value_list

        v3=models.Business.objects.value_list("id","caption")  #取出的是Querryset类型数据,里面是元组[(1,运维),(2,开发),]

    渲染方式:

     1 def business(request):
     2     #所有查询
     3     v1=models.Business.objects.all()
     4     #查询部分字段  value
     5     v2=models.Business.objects.values('id','caption',)
     6 
     7     #查询部分字段,返回元组格式 value_list
     8     v3=models.Business.objects.values_list('id','caption')
     9 
    10     return render(request, 'business.html', {"v1": v1, "v2": v2,'v3':v3})
    <ul>
        {% for row in v1 %}
            <li>{{ row.id }}-{{ row.caption }}-{{ row.code }}</li>
        {% endfor %}
    </ul>
    <ul>
        {% for row in v2 %}
            <li>{{ row.id }}-{{ row.caption }}</li>
        {% endfor %}
    </ul>
    <ul>
        {% for row in v3 %}
            <li>{{ row.0 }}-{{ row.1 }}</li>
        {% endfor %}
    </ul>
  • 相关阅读:
    每日总结2021.9.14
    jar包下载mvn
    每日总结EL表达语言 JSTL标签
    每日学习总结之数据中台概述
    Server Tomcat v9.0 Server at localhost failed to start
    Server Tomcat v9.0 Server at localhost failed to start(2)
    链表 java
    MVC 中用JS跳转窗体Window.Location.href
    Oracle 关键字
    MVC 配置路由 反复走控制其中的action (int?)
  • 原文地址:https://www.cnblogs.com/chenxiaozan/p/13061023.html
Copyright © 2011-2022 走看看