• 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>
  • 相关阅读:
    C# 之 读取Word时发生 “拒绝访问” 及 “消息筛选器显示应用程序正在使用中” 异常的处理
    sctp和tcp的区别
    kmalloc/kfree,vmalloc/vfree函数用法和区别
    C语言中volatile关键字的作用
    嵌入式开发之NorFlash 和NandFlash
    linux中断--中断嵌套&中断请求丢失
    Linux 套接字编程中的 5 个隐患
    socket编程中write、read和send、recv之间的区别
    HTTP/1.1 Range和Content-Range
    探讨read的返回值的三种情况
  • 原文地址:https://www.cnblogs.com/chenxiaozan/p/13061023.html
Copyright © 2020-2023  润新知