数字货币量化交易

django之ORM操作

2019-04-25  本文已影响0人  清风徐来_简

Django 中有一个强大的功能,就是ORM,他可以不写sql语句,使用python语法,即可操作数据库。当然也有自己的书写规则。大概看一下django中的ORM的使用规则。

前奏

一、单个表的增删改查

表:
class User(models.Model):
    username=models.charFiled(max_lenth=255)
    password=models.charFiled(max_lenth=255)
创建:User.objects.create(username='zhangsan',password='123')
查询:objs = User.objects.all()
删除:objs = bjects.filter('id=1')
      objs.delete()
更新:obj = objs[0]
      obj.username = "new_name"
      obj.save()

接下来看一下ORM中其他的一些查询语句。

为什么查询那么重要?
操作数据库,简单来说就是对数据进行增删改查,在数据的增删改查四步操作中,只有增加不用查询,删除、更改 都是在查询出结果的前提下才能进行,所以ORM查询尤为重要。

举个简单的例子,来练习一下 django的ORM查询语句 。

二、常见的单表查询(13种)

QuerySet 对象的形成:
按照需求执行sql语句,从数据库查询出一个表,
表里的每个记录封装成对象,每个字段封装成属性,
而这个表就可以看成是QuerySet对象。

class Person(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    birth = models.DateField(auto_now=True)

    def __str__(self):
        return '<Person obj:{}--{}>'.format(self.name,self.id)

    # class Meta:
    #     ordering = ('id',)
    # 为此类指定默认排序方式。

三、单表查询的双下划线方法

四、有外键关系的查询

1,【正向查询】---> 从多往1找(一般外键都设在多的一方)

2,【反向查询】---> 从1往多找

五、多对多关系的增删改查

1,【正向查询】

六、聚合与分组

from django.db.models import Avg, Sum, Max, Min, Count

1、聚合函数

2、分组

七、F查询、Q查询

class Book(models.Model):
    title = models.CharField(max_length=32)
    publisher = models.ForeignKey(to='Publisher') 

    price = models.DecimalField(max_digits=5,decimal_places=2,null=True)
    # 此字段为以后聚合函数使用      最大长度      小数点后长度    可以为空
    # 后加的字段,需要设置默认值,要不就设置可以为空

    kucun = models.IntegerField(default=0)
    sale = models.IntegerField(default=100)
    # 后加字段,为测试 F查询、Q查询使用
from django.db.models import F, Q

八、面试题

from django.db import models


class WfModel(models.Model):
    """
    工作流
    """
    model_id = models.AutoField(primary_key=True)  # 主键ID
    model_name = models.CharField(max_length=255)  # 工作流名称
    create_time = models.DateTimeField(auto_now_add=True)  # 添加时间

    def __str__(self):
        return "ID为%s的%s号" % (self.model_id, self.model_name)


class WfStep(models.Model):
    """
    工作流步骤
    """
    step_id = models.AutoField(primary_key=True)  # 主键ID
    model = models.ForeignKey(WfModel, models.DO_NOTHING)  # 流程ID
    step_name = models.CharField(max_length=255)  # 步骤名称

    def __str__(self):
        return self.step_name


class WfStepCheck(models.Model):
    """
    工作节流点人员表
    """
    check_id = models.AutoField(primary_key=True)  # 主键
    step = models.ForeignKey(WfStep, models.DO_NOTHING)  # 步骤ID
    check_user_id = models.IntegerField()  # 角色ID或用户ID
    is_design = models.BooleanField(default=1)  # 是否设计;1是;0否;

    def __str__(self):
        return "%s的%s号人员,check_id为%s" % (self.step, self.check_user_id, self.check_id)
# sql = "select step_id from app_wfstep where model_id in (1,2,3)"
sql = "select is_design from app_wfstepcheck where step_id in(select step_id from app_wfstep where model_id in (1,2,3))"

from django.db import connection

cursor = connection.cursor()
cursor.execute(sql)
row = cursor.fetchall()
print(row)

或者使用以下的orm查询语句↓ (执行一次数据库查询)
objects = WfStepCheck.objects.select_related('step').filter(step__model__model_id__in=[1, 2, 3]).values('is_design')
print(objects)
objects = WfStepCheck.objects.filter(step__model__model_id__in=[1, 2, 3])
#print(objects)
#如果单独查询,直接print的话会执行多次sql,但是如果使用objects.update()会执行一次sql。
#所以:如果是更新的话,不用使用select_related,但要是查询的时候建议使用select_related,减少数据库查询次数。
objects.update(is_design=0)
def get_wf_check():
    """获取步骤的审批人员信息"""
    step_check = []
    for item in WfModel.objects.filter(model_id=3):
        # print("item-->",item)
        for step in WfStep.objects.filter(model=item):
            # print("step-->",step)
            for stepcheck in WfStepCheck.objects.filter(step=step):
                # print("stepcheck-->",stepcheck)
                step_check.append(stepcheck)
    return step_check

ret = get_wf_check()
print(ret)

# for obj in ret:
#     print(obj.check_id, obj.check_user_id, obj.step, obj.is_design)

这样不好,他会多次去查询数据库,增加数据库压力。最好这样,只查询一次:

ret = WfStepCheck.objects.select_related('step').filter(step__model__model_id=3)
print(ret)

1,每一张表在数据库中,都是以app的名字开头
2,外键的字段在数据库中,会自动加上_id
3,__str__中必须返回字符串,如果想要在models类里面显示数字类的信息,需要str一下。

上一篇 下一篇

猜你喜欢

热点阅读