Django之ORM
单表查询
  1. 什么是ORM?
	    关系映射对象
        # 不但在python中有,在其他语言中也有
  2. 特点:
	    在操作数据库的时候,不用在写原生SQL语句
        '''相对而言,执行效率低了'''
  3. ORM书写的位置:
	    在models.py文件中
  4. 如何使用?
	    类名    >>>   表名
         对象    >>>   记录
         属性    >>>    字段
表的创建
from django.db import models
# 创建一张表出来,必须继承models class User(models.Model): # 组合索引,联合索引 # id int primary key auto_increment id = models.IntegerField(primary_key=True) # username, max_length必须写 username = models.CharField(max_length=32) # varchar(32) # password, orm支持自定义数据类型 password = models.CharField(max_length=32) # char()
补充:ORM不能创建数据库,必须提前把库创建完成

数据迁移
类写完之后,一定要执行数据库迁移命令,才能真正的创建出来数据表
python manage.py makemigrations python manage.py migrate
注意:凡是跟数据相关的操作都要执行以上两句话
第二种方式
只需要书写makemigrations和migrate两个命令,分别执行即可

记录的增删改查
增:直接增加,添加完成之后执行数据迁移命令就可以
删:直接注释,再执行数据迁移命令就可以,需注意,这样做之后原来的数据也会跟着丢失。
改:直接更改,更改完成之后执行数据迁移命令就可以
查:直接看
字段的增删改查
增:
第一种
res = models.User.objects.create(username='ys', password=123) print(res.username)
第二种
obj = models.User(username='ys', password=123) obj.save()
查
第一种查全部
res = models.User.objects.filter().all()
第二种
res = models.User.objects.filter(pk=1).first()
frist的原理

pk=1就相当于id=1
改
第一种
models.User.objects.filter(id=1).update(username='YS')
# 可以写成pk
models.User.objects.filter(pk=1).update(username='YS')
第二种
res = models.User.objects.filter(pk=1,username='aaa').first() # 查 # 返回值是个对象,列表 print(res) print(res.username) print(res.password) res.username ='aaa' # 第二种 res.save()
删
models.User.objects.filter(pk=1).delete()
网页增删改查练习

models.py文件
from django.db import models
# Create your models here.
class User(models.Model):
    id = models.AutoField(primary_key=True, verbose_name='主键')
    username = models.CharField(max_length=32, verbose_name='用户名')
    # password = models.IntegerField(verbose_name='密码')
    password = models.CharField(verbose_name='密码', max_length=64)
views.py文件
def home(request):
    user_list = models.User.objects.all()
    return render(request, 'home.html', locals())
# 添加数据
def add(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        models.User.objects.create(username=username, password=password)
        return redirect('/home/')
    return render(request, 'add.html')
# 修改数据
def edit(request):
    id = request.GET.get('id')
    edit_obj = models.User.objects.filter(pk=id).first()
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        models.User.objects.filter(pk=id).update(username=username, password=password)
        return redirect('/home')
    return render(request, 'edit.html', locals())
# 删除数据
def delete(request):
    id = request.GET.get('id')
    models.User.objects.filter(pk=id).delete()
    return redirect('/home/')
urls.py文件
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),
    url(r'^home/', views.home),
    url(r'^add/', views.add),
    url(r'^edit/', views.edit),
    url(r'^delete/', views.delete),
]
add.html
    <div class="container">
        <div class="row">
            <h1 class="text-center">添加数据</h1>
            <form action=""method="post">
                <div class="form-group">username:
                    <input type="text" name="username" class="form-control">
                </div>
                <div class="form-group">password:
                    <input type="password" name="password" class="form-control">
                </div>
                <input type="submit" value="提交" class="btn btn-success btn-block">
            </form>
        </div>
    </div>
edit.html
    <div class="container">
        <div class="row">
            <h1 class="text-center">删除数据</h1>
            <form action=""method="post">
                <div class="form-group">username:
                    <input type="text" name="username" class="form-control" value="{{ edit_obj.username }}">
                </div>
                <div class="form-group">password:
                    <input type="password" name="password" class="form-control" value="{{ edit_obj.password }}">
                </div>
                <input type="submit" value="提交" class="btn btn-success btn-block">
            </form>
        </div>
    </div>
home.py
    <div class="container">
        <div class="row">
            <h1 class="text-center">列表展示页</h1>
            <a href="/add/" class="btn btn-success btn-lg">添加数据</a>
            <table class="table table-striped table-hover">
                <thead>
                    <tr>
                        <th>id</th>
                        <th>username</th>
                        <th>password</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody>
                {% for user in user_list %}
                 <tr>
                        <td>{{ user.id }}</td>
                        <td>{{ user.username }}</td>
                        <td>{{ user.password }}</td>
                        <td>
                            <a href="/edit/?id={{ user.id }}" class="btn btn-primary">修改</a>
                            <a href="/delete/?id={{ user.id }}" class="btn btn-danger">删除</a>
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
ORM创建表关系
1、一对多
外键字段建在多的一方
publish_id = models.ForeignKey(to='关联表明') # 如果关联的是id字段,那么可以省略不写
2、多对多
外键字段不建在任何一张表,而是,建在第三张表中
authors = models.ManyToManyField(to='关联表明')
# authors是一个虚拟字段,不会真正的在book表中创建出来这个字段,这个字段是关联第三张表的
3、一对一
外键字段建在任何一方都可以,但是,推荐建在使用频率比较高的一张表
author_detail = models.OneToOneField(to='关联表明')
END
                    
                
                
            
        
浙公网安备 33010602011771号