Django——ORM基础操作

一、ORM创建表结构

通过以下6步,可以创建一个空表(只有定义好的列,没有数据)

1、创建数据库

因为Django无法创建数据库,所以需要在外面创建数据库;

2、修改Django默认数据库

在Django项目的全局配置setting中修改默认数据库(默认是SQLlite);

# 默认
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

修改为MySQL(第三方数据库):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'s4day70db',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': 3306,
        }
}
3、修改Django默认用来连接数据库的工具

在全局的初始化文件init.py中添加两行(Django默认使用MySQLdb连接,现改用第三方工具pymysql)

import pymysql

pymysql.install_as_MySQLdb()
4、创建表和列

在对应的App文件夹下的models.py中写ORM语句

from django.db import models
   
class UserInfo(models.Model):
	“”“
	类名即表名。需要注意的是,ORM类需要继承自`models.Model`
	通过调用models的方法创建列(字段)
	”“”
    nid = models.BigAutoField(primary_key=True)
    user = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField(default=1)
    
    # 这里的字段名虽然是ug,创建表后自动改成ug_id
    # 同时,外键关联的是整个UserGroup表,而不是其中一列,所以ug指向一张表
    ug = models.ForeignKey("UserGroup",null=True)
5、注册App

在全局设置setting中找到INSTALLED APP,并添加新增的App

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

添加后:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]
6、创建数据表

终端执行。命令执行完后会在对应的App文件夹下生成一个migrations子目录,其中的文件为ORM操作日志。

python manage.py makemigrations    # 转换成SQL语句

python manage.py migrate    # 执行SQL语句
二、ORM操作表数据
from app01 import models
1、增删查改

a)增

models.表名.objects.create(field1='XXX', field2='XXX', ...)

#注意,对于外键,这里使用的是ug_id,而不是ug(创建时的字段名)
models.UserInfo.objects.create(user='root',password='pwd',age=18,ug_id=1)

b)删

models.表名.objects.filter(筛选条件).delete()

models.UserGroup.objects.filter(id=2).delete()

c)查

# 获取单条数据,不存在则报错(不建议)
group_list = models.Tb1.objects.get(id=123)         

# 获取指定条件的数据
group_list = models.UserGroup.objects.filter(id=1)

# 获取全部
group_list = models.UserGroup.objects.all()

# 获取全部的指定列
group_list = models.UserGroup.objects.all().values('field1', 'field2', ...)

# 获取指定列时,可以通过外键进行跨表指定,但需要使用双下划线
group_list = models.UserGroup.objects.all().values('field1', 'ug__title', ...)

d)改

models.表名.objects.filter(筛选条件).update(修改内容)

models.UserGroup.objects.filter(id=2).update(title='公关部')
2、筛选查找

a) 大于、小于 field__gt/lt

models.Tb1.objects.filter(id__gt=1)    # 获取id大于1的值
models.Tb1.objects.filter(id__lt=10)    # 获取id小于10的值

models.Tb1.objects.filter(id__gte=1)    # 获取id大于等于1的值
models.Tb1.objects.filter(id__lte=10)    # 获取id小于10的值

models.Tb1.objects.filter(id__lt=10, id__gt=1)    # 获取id大于1且小于10的值

b) AND 和 OR

# AND
models.Tb1.objects.filter(id__lt=10, id__gt=1)    # 获取id大于1且小于10的值

# OR
from django.db.models import Q

models.Tb1.objects.filter(Q(id__lt=10) | Q(id__gt=1)) 

c) field__in

models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据

models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

d) field__range

models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and

e) field__contains

models.Tb1.objects.filter(name__contains="ven")

models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感

models.Tb1.objects.exclude(name__icontains="ven")

f) field__isnull

Entry.objects.filter(pub_date__isnull=True)

g) limit

models.Tb1.objects.all()[10:20]

h) 正则

Entry.objects.get(title__regex=r'^(An?|The) +')

Entry.objects.get(title__iregex=r'^(an?|the) +')    # 不区分大小写
3、排序
models.Tb1.objects.filter(name='seven').order_by('id')    # asc

models.Tb1.objects.filter(name='seven').order_by('-id')   # desc
4、分组
from django.db.models import Count, Min, Max, Sum

models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))

# SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" 
FROM "app01_tb1" 
WHERE "app01_tb1"."c1" = 1 
GROUP BY "app01_tb1"."id"
5、ORM语句表达不出,就写原生SQL语句
from django.db import connection, connections

# 使用默认的数据库,等价于cursor = connections['default'].cursor()
# 在全局设置的setting中的DATABASES中可设置,default可换
cursor = connection.cursor()   

cursor.execute("""SELECT * from auth_user where id = %s""", [1])

row = cursor.fetchone()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值