15 orm操作之用户登录、注册、编辑、删除

django orm简介

# 什么是ORM?
ORM:对象关系映射
# 为什么要用ORM?
能够让不会写SQL语句的python程序员
   使用面向对象的语法即可简单快捷的操作MySQL,极大地提升开发效率
'''但是ORM有时候自动生成的SQL效率可能会很低'''


对象 一行行记录
对象点属性     记录某个字段对应的值
# 如何使用ORM?
在django应用文件夹下的models.py中操作
 
"""orm无法创建库 需要自己提前创建好"""

orm创建表(models.py)

"""
强调:只要在models.py中改动了与数据库相关的代码 就必须要重新执行迁移命令
"""

# 1.先在models.py中书写类相关的代码
   from django.db import models
   # Create your models here.
   class User(models.Model):   # create table User
       id = models.AutoField(verbose_name='编号', primary_key=True)     # id int primary key auto_increment comment '编号'
       name = models.CharField(verbose_name='姓名', max_length=32)  # name varchar(32) comment '姓名'
       pwd = models.IntegerField(verbose_name='密码')
   
   
# 2.点击Terminal,执行数据库迁移命令
python3 manage.py makemigrations # 将改动记到小本本上(migrations)
   python3 manage.py migrate  # 真正操作数据库
   
   """pycharm快捷提示(tools>>>run manage.py task)"""

补充

1.主键字段orm会自动创建 只不过名字固定为id
2.CharField字段类型必须要有max_length参数

字段增删改查

# 当表中已经有数据存在的情况下如果添加新的字段那么需要设置null或者default
password = models.IntegerField(verbose_name='密码',null=True)  # pwd int comment '密码'
age = models.IntegerField('年龄',default=18)

数据增删改查

# 点击 Python Console
from app01 import models # 定义models模块



# 查
models.User.objects.all()  # 查询user表中所有的数据
# select * from user;
<QuerySet [<User: jason>, <User: tony>, <User: kevin>]> # 结果集
   
models.User.objects.filter(name='jason')  # 查询name=jason的数据
# select * from user where name='jason'
   <QuerySet [<User: jason>]> # 结果集
user_obj =  models.User.objects.filter(name='jason')[0]
user_obj.name
'jason'
user_obj.password
123
   
models.User.objects.filter(name='jason',password=123)
# select * from user where name='jason' and password=123
   <QuerySet [<User: jason>]>
"""
QuerySet我们可以简单的理解为是列表套一个个数据对象
"""




# 增
models.User.objects.create(name='jerry',password=567)
# insert into user(name,password) values('jerry',567)
   上述orm返回值为当前被创建出来的数据对象本身
   
obj = models.User(name='tom',password=111)  # 类产生对象
obj.password=123 # 可在保存之前修改数据
obj.save()  # 对象调用save方法保存到数据库




# 改
edit_obj = models.User.objects.filter(id=3)[0]
edit_obj.name = 'kevinSB'
edit_obj.save()

models.User.objects.filter(name='jason').update(name='jasonNB')
# update user set name='jasonNB' where name='jason';
 



# 删
models.User.objects.filter(id=5).delete()
# delete from user where id=5;

课堂练习

1.查看当前所有表数据(前端展示)  /home/
2.书写用户注册页面(前端展示)   /register/
3.编辑用户数据
4.删除用户
"""
重在思路
"""

urls.yp

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   # 数据展示页
   url(r'^home/',views.home),
   # 数据录入页
   url(r'^register/',views.register),
   # 数据删除页
   url(r'^data_delete/',views.data_delete),
   # 数据编辑页
   url(r'^data_edit/',views.data_edit)
]

views.py

from django.shortcuts import render, HttpResponse, redirect
from app01 import models


# Create your views here.


def home(request):
   # 1.查询user表中所有的数据
   user_data = models.User.objects.all()  # queryset [数据对象,数据对象,...]
   # 2.将数据利用模板语法传递给html文件
   return render(request, 'home.html', locals())  # {'user_data':user_data}


def register(request):
   if request.method == 'POST':
       username = request.POST.get('username')
       password = request.POST.get('password')
       # 先比对用户名是否重复
       is_exists = models.User.objects.filter(name=username)   # queryset[]
       if is_exists:
           return HttpResponse('用户名已存在')
       # 将用户数据写入数据库
       models.User.objects.create(name=username, password=password)
       # 返回数据展示页
       return redirect('/home/')
   return render(request, 'register.html')


def data_delete(request):
   # 获取用户需要删除的数据主键值
   delete_id = request.GET.get('delete_id')
   models.User.objects.filter(id=delete_id).delete()
   # 再次返回数据展示页
   return redirect('/home/')


def data_edit(request):
   # 1.获取用户需要修改的数据主键值
   edit_id = request.GET.get('edit_id')

   if request.method == 'POST':
       username = request.POST.get('username')
       password = request.POST.get('password')
       # 修改表数据
       models.User.objects.filter(id=edit_id).update(name=username, password=password)
       # 返回展示页
       return redirect('/home/')

   # 2.根据主键值查询具体数据
   edit_obj = models.User.objects.filter(id=edit_id).first()  # queryset[]
   '''filter 的结果是一个queryset,可以看成是列表套数据对象,在取值的时候可以用索引,但推荐使用first方法'''
   # 3.返回给用户一个编辑页面,上面提前写好用户需要编辑的数据
   return render(request, 'edit_data.html', locals())

home.html

<div class="container">
    <div class="row">
        <h1 class="text-center">数据展示</h1>
        <div class="col-md-8 col-md-offset-2">
        <a href="/register/" class="btn btn-primary">用户注册</a>
            <table class="table table-hover table-striped">
                <thead>
                    <tr>
                        <th>id</th>
                        <th>name</th>
                        <th>password</th>
                        <th>operate</th>
                    </tr>
                </thead>
                <tbody>
                    {% for user_obj in user_data %}
                        <tr>
                            <td>{{ user_obj.id }}</td>
                            <td>{{ user_obj.name }}</td>
                            <td>{{ user_obj.password }}</td>
                            <td>
                                <a href="/data_edit/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
{#                                通过GET请求,url后面携带id的方式获取#}
                                <a href="/data_delete/?delete_id={{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a>
                            </td>
                        </tr>
                    {% endfor %}

                </tbody>
            </table>

        </div>
    </div>
</div>

register.py

<div class="container">
    <div class="row">
        <h1 class="text-center">用户注册</h1>
        <div class="col-md-8 col-md-offset-2">
            <form action="" method="post">
                <p>username:
                    <input type="text" name="username" class="form-control">
                </p>
                <p>password:
                    <input type="text" name="password" class="form-control">
                </p>
                <input type="submit" value="注册" class="btn btn-block btn-success">
            </form>
        </div>
    </div>
</div>

edit_data.html

<div class="container">
    <div class="row">
        <h1 class="text-center">编辑用户</h1>
        <div class="col-md-8 col-md-offset-2">
            <form action="" method="post">
                <p>username:
                    <input type="text" name="username" class="form-control" value="{{ edit_obj.name }}">
                </p>
                <p>password:
                    <input type="text" name="password" class="form-control" value="{{ edit_obj.password }}">
                </p>
                <input type="submit" value="编辑" class="btn btn-block btn-success">
            </form>
        </div>
    </div>
</div>

 

orm外键创建

一对多外键关系  
	"""在orm中 外键字段建在多的一方"""
多对多外键关系
	"""在orm中 可以直接写在查询频率较高的表中(自动创建第三张表)"""
一对一外键关系
	"""在orm中 直接写在查询频率较高的表中"""
    
# 一对多
    publish = models.ForeignKey(to='Publish')
# 多对多
    authors = models.ManyToManyField(to='Author')  # 自动创建书籍和作者的第三张关系表
# 一对一
    author_detail = models.OneToOneField(to='AuthorDetail')
    
"""
ForeignKey OneToOneField  会自动给字段加_id后缀
"""
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    # 一对多
    publish = models.ForeignKey(to='Publish')
    # 多对多
    authors = models.ManyToManyField(to='Author')  # 自动创建书籍和作者的第三张关系表

class Publish(models.Model):
    title = models.CharField(max_length=32)

class Author(models.Model):
    name = models.CharField(max_length=32)
    # 一对一
    author_detail = models.OneToOneField(to='AuthorDetail')

class AuthorDetail(models.Model):
    addr = models.CharField(max_length=32)
    phone = models.BigIntegerField()

作业

1.整理今日内容及博客
2.脱稿完成数据增删改查操作(重要)

 

posted @ 2022-04-15 16:36  vonmo  阅读(227)  评论(0编辑  收藏  举报