Django之ORM

ORM

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不能创建数据库,必须提前把库创建完成

Django之ORM

 数据迁移

  类写完之后,一定要执行数据库迁移命令,才能真正的创建出来数据表

python manage.py makemigrations
python manage.py migrate

  注意:凡是跟数据相关的操作都要执行以上两句话

  第二种方式

  只需要书写makemigrations和migrate两个命令,分别执行即可

Django之ORM

记录的增删改查

  增:直接增加,添加完成之后执行数据迁移命令就可以

  删:直接注释,再执行数据迁移命令就可以,需注意,这样做之后原来的数据也会跟着丢失。

  改:直接更改,更改完成之后执行数据迁移命令就可以

  查:直接看

字段的增删改查

  增:

  第一种

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的原理

Django之ORM

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

网页增删改查练习

Django之ORM

  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

 

上一篇:使用gprof2dot和graphivz生成程序运行调用图


下一篇:MST(最小生成树)