hello world

人生若只如初见

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:\py27\Django_project\djangomodel>python manage.py makemigrations
Migrations for 'App':
  App\migrations\0001_initial.py
    - Create model Person

E:\py27\Django_project\djangomodel>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('创建成功')

posted on 2019-11-28 17:44  一壶兔  阅读(168)  评论(0编辑  收藏  举报

导航