Django框架 之 ORM★增删改查★表单详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/PY0312/article/details/102501233



一. ORM基本配置

=================================================================================

1.创建 django 项目

  • 命令行:cmd先去到django创建目录,然后输入django-admin startproject django项目名称
  • pycharm就直接创建新project选择django

2.settings.py 文件配置

  • 2.1.需要在install_app中配置需要连接的app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app_mysql.apps.AppMysqlConfig', # 这个是我们pycharm创建时候自动帮我们注册的就是app配置
    'app_mysql', # 如果有新的或者命令行创建的app我们只要这这里面把app名称写上去即可
]
  • 2.2. 需要在database中进行配置连接mysql的用户名和密码以及数据库
DATABASES = {
    'default':{
        'ENGINE':'django.db.backends.sqlite3',  #sqlite3数据库是个小型的数据库
        'NAME':os.path.join(BASE_DIR,'sqlite3') #NAME填写路径即可
    }
    # 'default': {
    #     'ENGINE': 'django.db.backends.mysql',
    #     'NAME':'库名',
    #     'USER':'mysql账号名称',
    #     'PASSWORD':'mysql密码',
    #     'HOST':'127.0.0.1',
    # }
}

3.__init__的配置

import pymysql
pymysql.install_as_MySQLdb()

4.models文件配置

  • 配置表单信息
from django.db import models

# Create your models here.
class sb(models.Model):
    # 主键自增id不用写, 默认会加上
    name = models.CharField(max_length=30,null=True)

class big_sb(models.Model):
    name = models.CharField(max_length=30, null=True)
    bigsb = models.ForeignKey('sb',id) 

class sb2(models.Model):
    name = models.CharField(max_length=30,null=True)

5.数据库迁移,生成表单语句

  • 在命令行进行以下操作,执行数据库迁移
python manage.py makemigrations
python manmge.py migrate

二. orm框架的表单的增删改查

=================================================================================
注意: 必须先在逻辑业务层中导入

from 表单所在的app名称 import models
# 其中表名均为在models中配置的表的名称

1.增

1.1 单条数据:

  • 方法一: models.表名.objects.create(字段1=值1,字段2=值2…)
  • 方法二: dict = {‘字段1’:值,‘字段2’:值…};models.表名.objects.create(**dict)

1.2 多条数据:

info = [
     models.UserInfo(name='root1', age=34, ut_id=1),
     models.UserInfo(name='root2', age=35, ut_id=2),
     models.UserInfo(name='root3', age=36, ut_id=1),
     models.UserInfo(name='root4', age=37, ut_id=3),
     models.UserInfo(name='root5', age=32, ut_id=1),
]
models.UserInfo.objects.bulk_create(info)

2.删

models.表名.objects.filter(满足的条件).delete()

3.改

models.表名.objects.filter(满足的条件).update(name='lll', age=23)

4.查(表A的ud关联表b)

models.UserType.objects.all().values()
4.1 有子健关系的查询正向查询通过A表中的ud查到表b的id
  • 方法一:
models.A.objects.all().values('ud__id')
  • 方法二:
res = models.A.objects.all()
for a in res:
    print(a.ud.id)
4.2 有子健关系的查询返向查询通过b表中的查到a表ID
  • 方法一:
models.B.objects.all().values('A__id')
  • 方法二:
res = models.B.objects.all()
for b in res:
    print(b.a_set.id) #### 表名小写_set

三. orm进阶查询

=================================================================================

1.字段名过滤

filter: 满足条件的
exclude: 不满足条件

  • 用法:
#id等于3的
models.表名.objects.filter(id=3).values()

#id不等于3的
models.表名.objects.exclude(id=3).values()
  • 关于filter与exclude里面填写的参数:

    • 等于: 字段名=值
    • 大于: 字段名__gt=值
    • 大于等于: 字段名__gte=值
    • 小于: 字段名__lt=值
    • 小于等于: 字段名__lte=值

2.成员 in, not in

res = models.表名.objects.filter(字段名__in=[2,4,5]) # where id in (2,4,5)
res = models.表名.objects.exclude(字段名__in=[1,2]) # where id not in (1,2)

3.区间 between…and

# where id between 4 and 8   [4,8]
res = models.表名.objects.filter(字段名__range=[4,8])

4.模糊查询 like

# where name like 'a%'
res = models.表名.objects.filter(字段名__startswith="a")
res = models.表名.objects.filter(字段名__istartswith="a") #忽略大小写

# where name like '%a'
res = models.表名.objects.filter(字段名__endswith="a")
res = models.表名.objects.filter(字段名__iendswith="a") #忽略大小写

# where name like '%a%'
res = models.表名.objects.filter(字段名__contains="a")
res = models.表名.objects.filter(字段名__icontains="a") #忽略大小写
只要是i开头的基本上都是忽略大小写

5.数据条数 count

# select count(*) from userinfo where id>3;
# select count(id) from userinfo where id>3;
#用sql语句查询数据条数尽量不要查count(*)查主键会快很多
res = models.UserInfo.objects.filter(id__gt=3).count()

6.排序 order by

#升序
res = models.表名.objects.order_by('字段名称')

#降序
res = models.表名.objects.order_by('-字段名称')

#多个条件进行排序
res = models.表名.objects.order_by('字段1','字段2') #当字段1相同是会更具字段2进行排序

7.分组 group by 以及 having

# select id, sum(age) as s, username from userinfo group by username
from django.db.models import Count, Min, Max, Sum
res = models.UserInfo.objects.values("name").annotate(s=Sum('age'))

# select id, sum(age) as s, username from userinfo group by username having s > 50;
res = models.UserInfo.objects.values("name").annotate(s=Sum('age')).filter(s__gt=50)

8.分页 limit

# limit 1, 3 分页
res = models.UserInfo.objects.all()[1:4]
# 因为获取对象是列表所有切片即可

9.last / first

# 第一条:
res = models.表名.objects.first()

# 最后一条:
res = models.表名.objects.last()

10.only | defer

  • 只查某个字段: only(‘字段名称’)
  • 除某个字段以外的所有字段: defer(‘字段名’)
    注意:主键id不管怎么样都会查

11.Q对象(and | or)

  • 只有 and
#id等于3and名字等于a
models.表名.objects.filter(id=3,and name='a').values()
  • 只有 or
# Q 对象
from django.db.models import Q
res = models.UserInfo.objects.filter(Q(id__gt=3) | Q(name='zekai')) #or用|链接
  • 有 and 和 or
# Q 对象
from django.db.models import Q
res = models.UserInfo.objects.filter( Q(Q(id__gt=3) | Q(name='zekai')) & Q(age=23) ) and&链接

12.F对象

from django.db.models import F
models.UserInfo.objects.update(name=F('name')+1) # 字段名称都加1

13.执行原生 sql 类似 pymysql

from django.db import connection, connections
cursor = connection.cursor()  # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone()
print(row)

14.去重 distinct

models.UserInfo.objects.values("name", 'age').distinct() # 前面values有多少个就对多少个值进行去除

四. 一个小技巧

=================================================================================

1.查看ORM对应的sql语句

print(res.query) # 查看上述代码生成的sql语句

猜你喜欢

转载自blog.csdn.net/PY0312/article/details/102501233