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>
原文地址:https://www.cnblogs.com/chenxiaozan/p/13061023.html