Django——ORM基础操作

一、ORM创建表结构

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)获取个数

models.Tb1.objects.filter(name='seven').count()

b) 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的值

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__isnull

Entry.objects.filter(pub_date__isnull=True)

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")

猜你喜欢

转载自blog.csdn.net/weixin_37641832/article/details/82951262