Django使用MySql数据库教程

Django使用MySql数据库教程

连接数据库

  1. 手动创建数据库
  2. settings中设置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}
  1. 项目同名的目录下,init文件,修改:
import pymysql
pymysql.install_as_MySQLdb()
  1. app中的models文件
from django.db import models

class UserInfo(models.Model):
    nid = models.AutoField(primary_key=True)  # 自增字段,设置为主键
    username = models.CharField(max_length=32)  # 字符串字段,最大长度为32
    password = models.CharField(max_length=64)

  1. settings文件注册app
INSTALLED_APPS = [
	'app',
]
  1. 创建数据库表
命令:
# 生成配置文件
python manage.py makemigrations   
# 执行配置文件
python manage.py migrate
  1. 想要修改表结构,直接在models文件中操作,然后执行6中的两条命令即可

  2. 创建外键关系

from django.db import models

class UserGroup(models.Model):
    """
    部门
    """
    title = models.CharField(max_length=32)


class UserInfo(models.Model):
    """
    员工
    """
    nid = models.AutoField(primary_key=True)  # 自增字段,设置为主键,不写也会有自增的id字段
    user = models.CharField(max_length=32)  # 字符串字段,最大长度为32
    password = models.CharField(max_length=64)
    # age = models.IntegerField(null=True)  # 可以为空
    age = models.IntegerField(default=1)  # 设置默认值
    ug = models.ForeignKey("UserGroup", null=True, on_delete=models.CASCADE)  # 外键关系
    # Django会自动在数据库中创建名称为 ug_id
  1. 数据库操作
def index(request):
    # 新增记录
    models.UserGroup.objects.create(title='销售部')
    
    # 查找
    group_list = models.UserGroup.objects.all()
    
    print(group_list)  # 输出为QuerySet类型  (相当于列表)
    for row in group_list:
        print(row.id, row.title)
     
    # 筛选查找,逗号连接的,指的是 and
    group_list = models.UserGroup.objects.filter(id=1,title='abc')
    group_list = models.UserGroup.objects.filter(id__gt=1) # 筛选id>1 (双下划线)
    group_list = models.UserGroup.objects.filter(id__lt=1)  # 筛选id<1
    
    # 删除
    models.UserGroup.objects.filter(id=2).delete()
    
    # 更新
    models.UserGroup.objects.filter(id=2).update(title='公关部')

ORM连表操作

app的models.py

from django.db import models


# Create your models here.
class Foo(models.Model):
    caption = models.CharField(max_length=16)
    
    
class UserType(models.Model):
    """
    用户类型
    """
    title = models.CharField(max_length=32)
    fo = models.ForeignKey('Foo', on_delete=models.CASCADE)


class UserInfo(models.Model):
    """
    用户表
    """
    name = models.CharField(max_length=16)
    age = models.IntegerField()
    ut = models.ForeignKey('UserType', on_delete=models.CASCADE)


app的views.py

from django.shortcuts import render, HttpResponse

# Create your views here.
from app01 import models


def test(request):
    # models.UserType.objects.create(title='普通用户')
    # models.UserType.objects.create(title='超级用户')
    # models.UserType.objects.create(title='白金用户')

    # models.UserInfo.objects.create(name='张三', age=18, ut_id=1)
    # models.UserInfo.objects.create(name='李四', age=18, ut_id=2)
    # models.UserInfo.objects.create(name='王二麻子', age=18, ut_id=3)
    # models.UserInfo.objects.create(name='陈五', age=18, ut_id=3)
    # models.UserInfo.objects.create(name='徐六', age=18, ut_id=3)

    # 获取
    result = models.UserInfo.objects.all()

    for obj in result: 
        print(obj.name, obj.age, obj.ut_id, obj.ut.title, obj.ut.caption)  
        # obj.ut.title 获取的是 UserInfo连接表UserType中的title值,
        # 同理 obj.ut.caption 获取的是 UserInfo连接表的UserType连接表的caption值

    return HttpResponse('...')

“正向操作” 与 “反向操作”

app的models.py

from django.db import models


class UserType(models.Model):
    """
    用户类型
    """
    title = models.CharField(max_length=32)


class UserInfo(models.Model):
    """
    用户表
    """
    name = models.CharField(max_length=16)
    age = models.IntegerField()
    ut = models.ForeignKey('UserType', on_delete=models.CASCADE)

app的views.py

def test(request):
    # '正向操作', 对有FK语句的表进行操作
    result = models.UserInfo.objects.all()
    for obj in result:
        print(obj.name, obj.age, obj.ut_id, obj.ut.title)
    # 通过ut将fk连接的表内容读取出来
    # 例如此处,拿出来的是每个用户对应的用户类型


    # '反向操作', 对没有fk语句的表进行操作
    # userinfo_set意义: fk所连接的表名的消息,加下划线,加set。
    obj = models.UserType.objects.all().first()
    print('用户类型', obj.id, obj.title)
    for row in obj.userinfo_set.all():
        print(row.name, row.age)
    # 比如此处,把属于第一个用户类型的所有用户的信息读取出来
    
    return HttpResponse('...')


# obj.userinfo_set.filter()   对用户类型中的所有用户信息进行筛选

获取数据的方法

def test(request):
    
    # 获取多个数据时
    # 1. 返回对象 [obj,obj,obj,...]
    models.UserInfo.objects.filter(id__gt=1)
    result = models.UserInfo.objects.all()
    for row in result:
        print(item.name, item.ut.title)
    
    # 2. 返回字典 [{id:1,name:'aa'},{id:2,name:'bb'},...]
	result = models.UserInfo.objects.all().values('id', 'name')  # 只取id和name这两列
    # 类型: QuerySet[{'id':'xx', 'name':'xx'}]
    for row in result:
        print(row['id'], row['name'])  # 输出的就是字典;  无法跨表
    
    # 实现跨表的方法
    result = models.UserInfo.objects.all().values('id', 'name', 'ut__title') # ut.title改为ut__title
    	for item in result:
            print(item['id'], item['name'], item['ut__title'])
    
    
        
        
	# 3. 返回元组 [(1,'aa'),(2,'bb'),...]
    result = models.UserInfo.objects.all().values_list('id', 'name')
    # 类型: QuerySet[(1,'a'),(2,'b')]
    for row in result:
        print(row[0], item[1])  # 输出的就是元组; 无法跨表
        
    # 实现跨表的方法
    result = models.UserInfo.objects.all().values_list('id', 'name', 'ut__title')
    for row in result:
        print(row[0], item[1], item[2])  # 输出的就是元组; 无法跨表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值