zoukankan      html  css  js  c++  java
  • Django(5)-model

    环境准备

    • 创建一个新项目
    django-admin startproject djangomodel
    django-admin startapp App
    python manage.py startapp App
    
    
    • 创建templates并标记
    • settings.py
    ALLOWED_HOSTS = ['*']
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'App',
    ]
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [
                os.path.join(BASE_DIR,'templates')
            ],
            
    
    DATABASES = {
        'default': {
            # 'ENGINE': 'django.db.backends.sqlite3',
            # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'GP1djangomodel',
            'PORT':'3306',
            'HOST':'localhost',
            'USER':'root',
            'PASSWORD':'mysql',
    
        }
    }
    
    
    LANGUAGE_CODE = 'zh-hans'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    • __init__.py
    import pymysql
    pymysql.install_as_MySQLdb()
    
    • mysql创建库
    mysql> create database GP1djangomodel charset=utf8;
    Query OK, 1 row affected (0.17 sec)
    
    • 迁移数据库
    python manage.py startapp App
    

    今日内容

    model

    • 在企业开发中,我们通常是从数据开始开发的

    开发流程

    1. 配置数据库
    2. 定义模型类(一个模型类对应数据库中的一张表)
    3. 生成迁移文件
    4. 执行迁移生成数据表
    5. 使用模型类进行增删改查(CRUD)操作

    ORM

    ORM(object relational mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间(数据与数据库之间)的转换,可以简单理解为翻译机,核心思想是解耦,将业务逻辑与数据库的SQL语句进行解耦

    graph LR
    实体-->ORM
    ORM-->数据库
    
    
    graph LR
    model-->ORM
    ORM-->database
    
    • 对象关系映射
    • 理解为翻译机
    • 核心思想,解耦合
      • 将业务逻辑和SQL进行了解耦

    Django定义模型

    • 重要概念:表,属性,字段
    • 一个模型在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段
    • 定义属性见定义属性文件
    • 创建模型类
    • 元选项,在模型中定义Meta,用于设置元信息(类中类)
        class Meta:
            db_table=xxx #定义数据表名,推荐使用小写字母
            ordering = []
            #对象的默认排序字段,获取对象列表时使用,通常是integer类型,升序ordering['id'],降序ordering['-id']
    

    数据库中数据类型

    • 字符串
    • 数字
    • 日期时间
    • models.py
    from django.db import models
    
    # Create your models here.
    #伪装Django模型
    class Person(models.Model):
        # 约束,用户名不允许重复
        p_name = models.CharField(max_length=16,unique=True)
        # 默认18岁
        p_age = models.IntegerField(default=18,db_column='age')
        # False 代表男,True代表女,db_column映射
        p_sex = models.BooleanField(default=False,db_column='sex')
        #改表名
        class Meta:
            db_table = 'People'
    
    E:py27Django_projectdjangomodel>python manage.py makemigrations
    Migrations for 'App':
      Appmigrations001_initial.py
        - Create model Person
    
    E:py27Django_projectdjangomodel>python manage.py migrate
    Operations to perform:
      Apply all migrations: App, admin, auth, contenttypes, sessions
    Running migrations:
      Applying App.0001_initial... OK
    

    模型成员objects

    Django默认通过模型的objects对象实现模型数据查询
    Django有两种过滤器用于筛选记录

    • filter : 返回符合筛选条件的数据集
    • exclude : 返回不符合筛选条件的数据集

    多个filter和exclude可以连接在一起查询

    模型过滤
        * filter
        * exclude
        * 连续使用
            * 链式调用
            * Persion.objects.filter(条件).filter(条件).xxx.exclude().exclude()
    

    创建model

    • djangomodel/urls.py
    from django.contrib import admin
    from django.conf.urls import url,include
    
    urlpatterns = [
        url('admin/', admin.site.urls),
        url('^App/',include('App.urls')),
    ]
    

    添加用户

    • App/urls.py
    #conding:utf-8
    from django.conf.urls import url
    from App import views
    urlpatterns = [
        url(r'^addpersions/',views.add_persions),
    
    ]
    
    • App/views.py
    from django.shortcuts import render,HttpResponse
    from App.models import Person
    import random
    # Create your views here.
    def add_persions(request):
        for i in range(15):
            persion = Person()
            flag = random.randrange(100)
            persion.p_name = 'Tom%d' %i
            persion.p_age = flag
            persion.p_sex = flag%2
            persion.save()
        return HttpResponse("批量创建成功")
    

    查询用户

    #conding:utf-8
    from django.conf.urls import url
    from App import views
    urlpatterns = [
        url(r'^addpersions/',views.add_persions),
        url(r'getpersions/',views.get_persions),
    
    ]
    
    • 过滤条件1 filter(将满足条件的拿出来)
    def get_persions(request):
        persion = Person.objects.filter(p_age__gt=18)
        context = {
            "persion":persion
        }
        return render(request,'persion_list.html',context=context)
    
    • 过滤条件2
    def get_persions(request):
        persion = Person.objects.filter(p_age__gt=50)
        context = {
            "persion":persion
        }
        return render(request,'persion_list.html',context=context)
    
    • 过滤条件3(级联调用)
    def get_persions(request):
        persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
        context = {
            "persion":persion
        }
        return render(request,'persion_list.html',context=context)
    
    • 过滤条件4 exclude(将满足条件的踢走)
    def get_persions(request):
        # persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
        persion = Person.objects.exclude(p_age__lt=50)
        context = {
            "persion":persion
        }
        return render(request,'persion_list.html',context=context)
    
    • 过滤条件5
    def get_persions(request):
        # persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
        persion = Person.objects.exclude(p_age__lt=50).filter(p_age__lt=80)
        context = {
            "persion":persion
        }
        return render(request,'persion_list.html',context=context)
    
    • persion类型,是查询结果集
    def get_persions(request):
        # persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
        persion = Person.objects.exclude(p_age__lt=50).filter(p_age__lt=80)
        print(type(persion))
        context = {
            "persion":persion
        }
        return render(request,'persion_list.html',context=context)
        
    System check identified no issues (0 silenced).
    November 28, 2019 - 11:37:41
    Django version 1.11.26, using settings 'djangomodel.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CTRL-BREAK.
    <class 'django.db.models.query.QuerySet'> #不是列表,但是可迭代
    [28/Nov/2019 11:37:41] "GET /App/getpersions/ HTTP/1.1" 200 478
    <class 'django.db.models.query.QuerySet'>
    [28/Nov/2019 11:37:43] "GET /App/getpersions/ HTTP/1.1" 200 478
    
    • 过滤条件 6
    def get_persions(request):
        # persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
        persion  = Person.objects.exclude(p_age__lt=50).filter(p_age__gt=80)
        print(type(persion))
        persiontwo = Person.objects.filter(p_age__in=[40,30,47])
        print(type(persiontwo))
        context = {
            "persion":persion,
            "persiontwo":persiontwo
        }
        return render(request,'persion_list.html',context=context)
    
    • templates/persion_list.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>persion_list</title>
    </head>
    <body>
    <h3>PersionList</h3>
    <ul>
        {% for persion in persion %}
        <li>姓名:{{ persion.p_name }} 年龄:{{ persion.p_age }}</li>
        {% endfor %}
    </ul>
    </body>
    </html>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>persion_list</title>
    </head>
    <body>
    <h3>PersionList</h3>
    <ul>
        {% for persion in persion %}
        <li>姓名:{{ persion.p_name }} 年龄:{{ persion.p_age }}</li>
        {% endfor %}
    </ul>
    <ul>
        {% for persiontwo in persiontwo %}
           <li>姓名2:{{ persiontwo.p_name }} 年龄2:{{ persiontwo.p_age }}</li>
        {% endfor %}
    </ul>
    </body>
    </html>
    

    创建对象

    通过方法创建对象,然后传递属性,属性可以指定默认值

    目的:向数据库中添加数据

    当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时才与数据库交互,将对象保存到数据库中

    注意:__init__已经在父类models.Model中使用,在自定义的模型中无法使用

    创建对象方案:

    在模型类中增加类方法去创建对象
    
    @classmethod
    
    def create(cls,name,age):
    
    在自定义的管理器中添加方法来创建对象
    
    #conding:utf-8
    from django.conf.urls import url
    from App import views
    urlpatterns = [
        url(r'^addpersions/',views.add_persions),
        url(r'getpersions/',views.get_persions),
        url(r'^addperson',views.add_person),
    
    ]
    
    • 要求写的字段都必须写
    def add_person(request):
        person = Person.objects.create(p_name = '小明',p_age = 15,p_sex=True)
        person.save()
        return HttpResponse('小明创建成功')
    

    方法

    • 对象方法
      • 可以调用对象的属性,也可以调用类的属性
    • 类方法
      • 不能调用对象属性,只能调用类属性
    • 静态方法
      • 啥都不能调用,不能获取对象属性,也不能获取类熟悉
      • 只是寄生在我们这个类上而已
    from django.db import models
    
    # Create your models here.
    #伪装Django模型
    class Person(models.Model):
        # 约束,用户名不允许重复
        p_name = models.CharField(max_length=16,unique=True)
        # 默认18岁
        p_age = models.IntegerField(default=18,db_column='age')
        # False 代表男,True代表女,db_column映射
        p_sex = models.BooleanField(default=False,db_column='sex')
         # 加属性
        p_hobby = models.CharField(max_length=32,null=True,blank=True)
        #改表名
        @classmethod
        # 不需要迁移
        def create(cls,p_name,p_age=100,p_sex=True,p_hobby='gaming'):
        # 造个对象
            return cls(p_name=p_name,p_age=p_age,p_hobby=p_hobby)
        class Meta:
            db_table = 'People'
    
    def add_person(request):
        # person = Person.objects.create(p_name = '小明',p_age = 15,p_sex=True)
        # person.save()
        # person = Person(p_age=28)
        # 是"" None Null 不能重写__init__ 可以通过其他手段,实现属性自定义赋值
        person = Person.create('jack')
        person.save()
        return HttpResponse('创建成功')
    
  • 相关阅读:
    Vue- 对象语法 v-bind:class与对象语法的使用(重要)
    关于vue中$emit事件问题
    深入理解vue.js2.0指令v-for使用及索引获取
    到底vuex是什么?
    Vue.js学习系列二 —— vuex学习实践笔记(附DEMO)
    前端HTML5几种存储方式的总结
    JSON和JS对象之间的互转
    Vue2.0子父组件通信
    C#字符串和16进制转换
    C#中int32 的有效值范围
  • 原文地址:https://www.cnblogs.com/yihutu/p/11951695.html
Copyright © 2011-2022 走看看