Django之orm基本的增删改查

orm概述

1 orm:对象关系映射(跟语言无关)
    	数据库中的表     ----》对应程序的一个类
        数据库中的一行数据----》对应程序中的一个对象
2 orm能干的事
	-创建表(不能创建数据库,手动创建数据库)
    -增加删除表内字段
    -增删查改数据
    
第一步在models中写要给类
	class UserInfo(models.Model):
        # 字段属性--》后面那个对象决定的,
        # 改字段自增,并且是主键
        id = models.AutoField(primary_key=True)
        # 改字段是varchar类型,长度为32(唯一约束,是否是索引,默认值是,是否可以为空)
        name = models.CharField(max_length=32)
        # 密码字段
        password =models.CharField(max_length=64)
第二步,把表创建出来(执行两个命令)
	-python3 manage.py makemigrations  # 这条命令会在migrations创建一条记录,数据库变更记录
    -python3 manage.py migrate         # 把更改同步到数据库

orm操作数据库 增

# models.py 文件
class UserInfo(models.Model):
    username = models.CharField(max_length=32,verbose_name='用户名')
    password = models.CharField(max_length=32,verbose_name='密码')
    age = models.IntegerField()
    addr = models.CharField(max_length=64,verbose_name='用户地址')
    phone = models.IntegerField(verbose_name='联系方式')
	# 打印对象的字符串信息 不然是一个objest对象
    def __str__(self):
        return self.username

# views.py 文件
from app01 import models
from django.shortcuts import render,HttpResponse,redirect
import hashlib
# 简单模仿一下登录功能
def index(request):
    if request.method == 'POST':
        
        # 前端传过来的数据 从request中取出
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 加密模块
        m = hashlib.md5()
        m.update(password.encode('utf-8'))
        res = m.hexdigest()[0:16]
        
        age = request.POST.get('age')
        addr = request.POST.get('addr')
        phone = request.POST.get('phone')
        # 前端取的的数据写入对应表的字段
        userinfo = models.UserInfo.objects.create(username=username,password=res,age=age,addr=addr,phone=phone)
        # 对象点 save() 才是真正保存数据  save() 是一个方法
        userinfo.save()
        
        # 返回给前端的显示的保存数据的状态信息
        return HttpResponse('200 ok 保存成功')
        
# urls.py 文件
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    			# 对应的是views.py文件的函数 不用加括号
    path('index',views.index),
]

orm 查

def userlist(request):
    # <QuerySet [<UserInfo: UserInfo object (1)>, <UserInfo: UserInfo object (2)>]>
    # data = models.UserInfo.objects.all()[0:3]  # 支持切片 取出三条数据 不支持负数
    # print(data[0])  # 通过索引取出一条数据
    #
    # # 只要返回的是 <QuerySet对象就可以一直点方法
    # data = models.UserInfo.objects.filter(username='陆帅哥').first()
    #
    # # 支持循环 对象点属性获取其他字段
    # print(data)
    # for i in data:
    #     print(i)
    #     print(i.username)
    
	# all() 代表所有  filter() 是查询的条件  first() 查询出来的第一个
    data = models.UserInfo.objects.all()
    # locals() 把函数局部空间的所有数据传递给前端
    return render(request,'templates/userlist.html',locals())

orm 修改

def alter(request):

    # 获取前端给过来要修改的ID号 如果是get请求 会携带一个id 就是访问当前要修改的记录id
    alter_id = request.GET.get('id')
    print(alter_id)
    # 查询条件是 数据库中查询id和前端传来的id就行修改
    re_alter = models.UserInfo.objects.filter(id=alter_id).first()

    # 这里可以直接在这个接口修改 也可以在增加一个修改接口
    if request.method == 'POST':
        post_id = request.POST.get('id')
        username = request.POST.get('username')
        password = request.POST.get('password')
        age = request.POST.get('age')
        addr = request.POST.get('addr')
        phone = request.POST.get('phone')
        """
        这里其实还有一步 判断用户修改的数据不能为空 或者是非法字符等等  现在暂时省略
        """
        # 第一种保存方式
        affect_rows = models.UserInfo.objects.filter(pk=alter_id).update(username=username,password=password,age=age,addr=addr,phone=phone)
        # 打印的是影响的行数
        print(affect_rows)
        print(alter_id)

        # 第二种保存方式
        # re_alter.username=username
        # re_alter.password=password
        # re_alter.age=age
        # re_alter.addr=addr
        # re_alter.phone=phone
        # re_alter.save()
        # 修改完成之后 跳转到修改之后的展示页面
        return redirect('http://127.0.0.1:8000/userlist')

    # 跳转到修改的 html地址 alter
    return render(request,'templates/alter.html',locals())

orm 删除

def delect(request):
    # 获取前端当前要删除的数据ID
    del_id = request.GET.get('id')

    # 数据库查询出来的ID跟前端传过来的ID删除
    models.UserInfo.objects.filter(pk=del_id).delete()
    
    # 删除之后跳转会展示页面
    return redirect('http://127.0.0.1:8000/userlist')

orm 增

def insert(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        age = request.POST.get('age')
        addr = request.POST.get('addr')
        phone = request.POST.get('phone')
        """
        这里其实还有一步 判断用户修改的数据不能为空 或者是非法字符等等  现在暂时省略
        """
        # 添加数据到数据库中
        affect_rows = models.UserInfo.objects.create(username=username, password=password, age=age,addr=addr, phone=phone)
        
        print(affect_rows)
        return redirect('http://127.0.0.1:8000/userlist')
        # 打印的是影响的行数
    return render(request,'templates/insert.html')

表与表的关系的建立

class Book(models.Model):
    title = models.CharField(max_length=64)
    """
    max_digits=None,:总位数
    decimal_places=None:小数位数
    """
    # price decimal(8,2)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    # publish_id = models.ForeignKey(to='Publish', to_field='id') to_field= 指定关联具体字段
    """对于外键字段关系,会自动帮我们拼接_id"""
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE) # 出版社跟图书是一对多
    """authors它是一个虚拟字段,它不会实际在表中创建出来这个字段,这一句可以自动帮助我们创建出来第三张表"""
    authors = models.ManyToManyField(to='Author') # 作者跟图书表是多对多
"""出版社表"""
class Publish(models.Model):
    name = models.CharField(max_length=64)
    addr = models.CharField(max_length=64)


"""作者表"""
class Author(models.Model):
    name = models.CharField(max_length=64)
    author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE) # 作者对作者详情是 一对一

"""作者详情表"""
class AuthorDetail(models.Model):
    phone = models.CharField(max_length=64)
    email = models.CharField(max_length=64)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值