zoukankan      html  css  js  c++  java
  • Django 操作数据库

    一、django的Model基本操作和增、删、改、查、

    注:默认使用了sqlite3数据库

    如果想使用其他数据库,请在settings里修改

    1.创建数据库:

    1、创建model类

    在app01(或者你的app下)下models.py写入以下内容:

    from django.db import models
    # Create your models here.
    # 这个类是用来生成数据库表的,这个类必须集成models.Model
    class UserInfo(models.Model):
        # 创建表的字段
        username = models.CharField(max_length=16) 
        # 这个就表示去数据库创建一个字符串类型的字段
        password = models.CharField(max_length=32)  
        # 对于字符串类型的字段必须设置一个最大长度

    2.注册app(如果没注册,那么不能创建数据库表)

    在settings里的INSTALLED_APPS里面加上你的app名字
    INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', ]

    3.创建数据库结构

    python  manage.py makemigrations 
    # 生成一个数据库结构migrations里面一个表
    python  manage.py migrate      
    # 根据migrations里面的表来创建数据库

    4.为了方便查询,所以将数据库注册到后台。通过admin后台来管理

    在app01下面的admin.py写入以下内容:
    
    from django.contrib import admin
    
    # Register your models here.
    # 导入app01的数据库模块
    from . import models
    
    # 注册咱们创建的类,通过他来访问
    admin.site.register(models.UserInfo)

    5.进入admin来管理

    URL地址  http://127.0.0.1:8000/admin/
    # 创建管理用户 python3 manag.py createsuperuser 输入用户名: 邮箱地址 密码: 确认密码:

    2.增、删、查、改数据:

    # 插入数据:
    UserInfo.objects.create(name='rain',password='123',email='rain@163.com')
    
    # 删除数据:
    UserInfo.objects.filter(name='rain').delete()
    
    # 修改数据:
    UserInfo.objects.filter(name='rain').update(name='Rain1')
    
    # 查找数据:
    UserInfo.objects.filter(name='rain')
    UserInfo.objects.all()
    UserInfo.objects.all()[:10] 
    # 切片操作,获取10个人,不支持负索引,切片可以节约内存
    UserInfo.objects.get(name='rain')
    #查找所有
    # models.UserInfo.objects.all()
    #查找指定条件
    # models.UserInfo.objects.filter(age=18)
    #查找第一个
    # models.UserInfo.objects.filter(age=18).first()
    #查找所有并且显示出来
    # user_list_obj = models.UserInfo.objects.all()
    # for line in user_list_obj:
    # print(line.username,line.age)

    url: 

        url(r'^index/', views.index),

    函数

    def login(request):
        #如果是GET请求
        #如果是POST,检查用户输入
        #print request.method 来查看用户是通过什么方式请求的
        #还有个问题:当你POST的时候,会出现问题,现在临时解决方法是:在seetings里注释掉
        '''
        MIDDLEWARE_CLASSES = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',  注释掉这一行
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        ]
        '''
        if request.method == 'POST':
            input_email = request.POST['email']
            input_pwd = request.POST['pwd']
            if input_email == 'luotianshuai@qq.com' and input_pwd == '123':
                #当登录成功后给它跳转,这里需要一个模块from django.shortcuts import redirect
                #成功后跳转到指定网址
                return redirect('/index/')
            else:
                #如果没有成功,需要在页面告诉用户用户名和密码错误.
                return render(request,'login.html',{'status':'用户名或密码错误'})
                #通过模板语言,来在login.html中添加一个status的替换告诉用户<span>{{ status }}</span>
    
        return render(request,'login.html')

    index

    def index(request):
        # 数据库去数据
        # 数据和HTML渲染
    
        # 如果想使用数据库,需要先导入(需要在开头导入)
        from app01 import models
        # 获取UserInfo表中的数据,下面一行语句是固定搭配
        user_info_list = models.UserInfo.objects.all()
        # user_info 列表,列表的元素就是一行.每一行有两个字段:一个是email 一个pwd
        return render(request,'index.html',{'user_info_list':user_info_list},)

    然后在html中循环通过模板语言进行渲染

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test </title>
    </head>
    <body>
        <div>
            <table border='1'>
                <thead>
                    <tr>
                        <th>邮箱</th>
                        <th>密码</th>
                    </tr>
                </thead>
                <tbody>
                
                    {% for line in user_info_list %}
                        <tr>
                            <td>{{ line.email }}</td>
                            <td>{{ line.pwd }}</td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
        </div>
    
    </body>
    </html>

    现在是没有数据的我们可以现在后台添加几个:

    2、添加数据

    在index.html中在加一个表单

    def index(request):
        # 数据库去数据
        # 数据和HTML渲染
    
        # 如果想使用数据库,需要先导入(需要在开头导入)
        if request.method == 'POST':
            # 获取html中提交过来的数据
            username = request.POST.get('username', None)
            pwd = request.POST.get('pwd', None)
            email = request.POST.get('email', None)
            # 创建数据也得用model
            # 他就表示去创建一条数据
            models.UserInfo.objects.create(username=username, pwd=pwd, email=email)
        # 获取UserInfo表中的数据,下面一行语句是固定搭配
        user_info_list = models.UserInfo.objects.all()
        # user_info 列表,列表的元素就是一行.每一行有两个字段:一个是email 一个pwd
        return render(request, 'index.html', {'user_info_list': user_info_list}, )

    登陆后测试:

    3、查、删除数据

    要删除肯定的先找到他,通过filter去找到,然后后面加delete删除

    models.UserInfo.objects.filter(email=email).delete() # 找到email=email的数据并删除

    函数

    def index(request):
        # 数据库去数据
        # 数据和HTML渲染
    
        # 如果想使用数据库,需要先导入(需要在开头导入)
        if request.method == 'POST':
            # 添加数据
            username = request.POST.get('username')
            pwd = request.POST.get('pwd')
            email = request.POST.get('email')
            # 创建数据也得用model
    
            models.UserInfo.objects.filter(email=email).delete()     # 找到email=email的数据并删除
    
        # 获取UserInfo表中的数据,下面一行语句是固定搭配
        user_info_list = models.UserInfo.objects.all()
        # user_info 列表,列表的元素就是一行.每一行有两个字段:一个是email 一个pwd
        return render(request, 'index.html', {'user_info_list': user_info_list},)

    效果:(只要匹配到email,就会删除掉)

    到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:

    • 创建数据库,设计表结构和字段
    • 使用 MySQLdb 来连接数据库,并编写数据访问层代码
    • 业务逻辑层去调用数据访问层执行数据库操作
    import MySQLdb
     
    def GetList(sql):
        db = MySQLdb.connect(user='root', db='luotianshuai', passwd='1234', host='localhost')
        cursor = db.cursor()
        cursor.execute(sql)
        data = cursor.fetchall()
        db.close()
        return data
     
    def GetSingle(sql):
        db = MySQLdb.connect(user='root', db='luotianshuai', passwd='1234', host='localhost')
        cursor = db.cursor()
        cursor.execute(sql)
        data = cursor.fetchone()
        db.close()
        return data

    首先Django是通过Model操作数据库,不管你数据库的类型是MySql或者Sqlite,Django它自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要回写Model就可以了!

    1、创建数据库表

    django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)

    •   PHP:activerecord
    •   Java:Hibernate 
    •    C#:Entity Framework

    django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。

    对于ORM框架里:

    我们写的表示数据库的表

    如果根据这个类创建的对象是数据库表里的一行数据

    对象.id 对象.value 是每一行里的数据 

    class UserInfo(models.Model):
        username = models.CharField(max_length=64)
        email = models.EmailField(max_length=64,null=True)
        email2 = models.EmailField(max_length=64,default="rain@163.com")

    2、更多字段

    1、null=True
      数据库中字段是否可以为空
    2、blank=True
      django的 Admin 中添加数据时是否可允许空值
    3、primary_key = False
      主键,对AutoField设置主键后,就会代替原来的自增 id 列
    4、auto_now 和 auto_now_add
      auto_now   自动创建---无论添加或修改,都是当前操作的时间
      auto_now_add  自动创建---永远是创建时的时间
    5、choices
    GENDER_CHOICE = (
            (u'M', u'Male'),
            (u'F', u'Female'),
        )
    gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
    6、max_length
    7、default  默认值
    8、verbose_name  Admin中字段的显示名称
    9、name|db_column  数据库中的字段名称
    10、unique=True  不允许重复
    11、db_index = True  数据库索引
    12、editable=True  在Admin里是否可编辑
    13、error_messages=None  错误提示
    14、auto_created=False  自动创建
    15、help_text  在Admin中提示帮助信息
    16、validators=[]
    17、upload-to
    更多参数
    1、models.AutoField  自增列 = int(11)
      如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
    2、models.CharField  字符串字段
      必须 max_length 参数
    3、models.BooleanField  布尔类型=tinyint(1)
      不能为空,Blank=True
    4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
      继承CharField,所以必须 max_lenght 参数
    5、models.DateField  日期类型 date
      对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
    6、models.DateTimeField  日期类型 datetime
      同DateField的参数
    7、models.Decimal  十进制小数类型 = decimal
      必须指定整数位max_digits和小数位decimal_places
    8、models.EmailField  字符串类型(正则表达式邮箱) =varchar
      对字符串进行正则表达式
    9、models.FloatField  浮点类型 = double
    10、models.IntegerField  整形
    11、models.BigIntegerField  长整形
      integer_field_ranges = {
        'SmallIntegerField': (-32768, 32767),
        'IntegerField': (-2147483648, 2147483647),
        'BigIntegerField': (-9223372036854775808, 9223372036854775807),
        'PositiveSmallIntegerField': (0, 32767),
        'PositiveIntegerField': (0, 2147483647),
      }
    12、models.IPAddressField  字符串类型(ip4正则表达式)
    13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
      参数protocol可以是:both、ipv4、ipv6
      验证时,会根据设置报错
    14、models.NullBooleanField  允许为空的布尔类型
    15、models.PositiveIntegerFiel  正Integer
    16、models.PositiveSmallIntegerField  正smallInteger
    17、models.SlugField  减号、下划线、字母、数字
    18、models.SmallIntegerField  数字
      数据库中的字段有:tinyint、smallint、int、bigint
    19、models.TextField  字符串=longtext
    20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
    21、models.URLField  字符串,地址正则表达式
    22、models.BinaryField  二进制
    23、models.ImageField   图片
    24、models.FilePathField 文件
    更多字段
  • 相关阅读:
    matplotlib 进阶之origin and extent in imshow
    Momentum and NAG
    matplotlib 进阶之Tight Layout guide
    matplotlib 进阶之Constrained Layout Guide
    matplotlib 进阶之Customizing Figure Layouts Using GridSpec and Other Functions
    matplotlb 进阶之Styling with cycler
    matplotlib 进阶之Legend guide
    Django Admin Cookbook-10如何启用对计算字段的过滤
    Django Admin Cookbook-9如何启用对计算字段的排序
    Django Admin Cookbook-8如何在Django admin中优化查询
  • 原文地址:https://www.cnblogs.com/yxy-linux/p/5846249.html
Copyright © 2011-2022 走看看