建立新项目

建立项目DJ

建立新应用App

记得注册

切换mysql

setting注册

伪装pymsql

迁移文件

设置时区

set global time_zone='+8:00';

结果如下

MODEL(模型)

企业开发中,通常是从数据开始开发的,不像之前直接从路由学起。
Django对各种数据库都提供了很好的支持,对不同的数据库,Django提供了统一调用的API,我们可以根据不同的业务需求使用不同的数据库。

  • 配置数据库:pip install pymysql
  • 在工程目录下的__init__.py中输入

    import pymysql 
    pymysql.install_as_MySQLdb()
  • 完成数据库驱动加载

SETTINGS.PY

'ENGINE':'django.db.backends.mysql'
'NAME':'数据库名'
'USER':'root'
'PASSWORD':'密码'
'HOST':'LOCALHOST',#连远端需要修改
'PORT':'3306',

开发流程

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

ORM

ORM(OBJECT RELATIONAL MAPPING)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不用类型系统的数据之间的转换,可以简单理解为翻译机。
核心特点是:解耦合   将业务逻辑和sql解耦(sql本身也是编程语言)

Django模型定义

重要概念:模型,表,属性,字段
一个模型映射一张表,一个属性映射表中的列

定义属性(坑)

见定义属性文件

数据库中数据类型:

  • 字符串
  • 数字
  • 时间

数据类型影响的是内存分配:例如布尔值1bit,一个字符串32bit

null 和 blank区别:null代表NONE表示什么都没有,而BLANK表示''即引号内为空

索引应用在:

  • 建立在外键上,滥用索引反而会降低查询速度
  • 经常查询的字段上

unique用在唯一约束,例如电话号码,用户名这种不允许重复的情况上

创建模型类

元信息

俗名类中类,通过类设置子类,再设置属性
元选项,再模型类中定义Meta,用于设置元信息:

class Meta:
    db_table = xxx #定于数据表名,推荐使用小写字母
    ordering=[]
    对象的默认排序字段,获取对象列表时使用,通常是Integer类形,升序ordering['id'],降序ordering['-id']

在App.models中设置模型:

from django.db import models

# Create your models here.
class Person(models.Model):
    p_name=models.CharField(max_length=16,unique=True)#用户名不允许重复,所以使用约束unique
    p_age = models.IntegerField(default=18,db_column='age')
    #False为男,True为女,db_clomn是设置映射后的数据库列名,默认列名为前面的属性名p_sex
    p_sex = models.NullBooleanField(default=False,db_column='sex')

    #修改表名,如果不设置Meta原表名为App_Person
    class Meta:
        db_table = 'People'

然后迁移数据makemigrations,注意:必须要提前注册App至settings.py中
查看表:

表名,列名都修改完成
但是default约束是放在操作中完成的,并没有放在建表语句中

模型成员objexts

Django默认通过模型的objexts对象实现模型数据查询
all()所有,get(条件)指定一个(不常用,因为我们通常查询数据需要筛选条件)
Django有两种过滤器用于筛选记录

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

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

模型过滤

filter,exclude连续使用

  • 链式调用,ruperson.objects.filter().filter().xxx.exclude().yyyy

为了实践我们用代码添加一些数据进去
首先添加一个App子路由,记得先注册:
总路由:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('App',include('App.urls')),
]

app子路由:

from django.conf.urls import url

from App import views

urlpatterns=[
    url('addpersons/',views.add_persons),
]

views:

from App.models import Person
import random

def add_persons(request):
    for i in range(15):
        person = Person()
        flag = random.randrange(100)
        person.p_name = 'tom%d' % flag
        person.p_age = flag
        person.p_sex = flag % 2
        person.save()
    return HttpResponse('批量创建成功')

运行访问:

报错原因是随机到了名字重复,因为之前约束了unique
将views中第8行改为

 person.p_name = 'tom%d' % i

修改完之后成功

查数据

添加路由

url('getpersons/',views.get_persons),

添加view函数

def get_persons(request):
    #__gt大于,__lt小于
    #筛选出大于18小于80的人的姓名和年龄
    # persons = Person.objects.filter(p_age__gt=18).filter(p_age__lt=80)
    #筛选出大于等于50的,及排除小于50的,并且小于80的
    persons = Person.objects.exclude(p_age__lt=50).filter(p_age__lt=80)
    #填坑
    context = {
        'persons':persons
    }
    return render(request,'person_list.html',context=context)

html文件person_list

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>personList</title>
</head>
<body>
<h3>personlist</h3>
<ul>
    {% for person in persons %}
    <li>姓名:{{ person.p_name }}年龄:{{ person.p_age }}</li>
    {% endfor %}

</ul>
</body>
</html>

查看结果


这里只展示一种结果
views代码里的persons是一个查询结果集:django.db.models.query.QuerySet

创建对象

目的:

向数据库中添加数据
当创建对象时,django不会对数据库进行读写操作,当调用save()方法时才与数据库交互,将对象保存到数据库中
注意: __init__已经在父类models.Model中使用,在自定义的模型中无法使用

创建对象方案:

views:

def add_person(request):

    person = Person.objects.create(p_name='张三', p_age=15, p_sex=True)

    person.save()

    return HttpResponse('创建成功')

 url:

   url('addperson', views.add_person),

结果:

假如我们现在再插入一个列比如p_hobby列,我们需要重新迁移

在模型类中增加类方法去创建对象

@classmethod
  def create(cls,name,age):

  在自定义的管理器中添加方法来创建对象

方法:

  •  对象方法

         可以调用对象的属性,也可以调用类的属性

  • 类方法

     - 不能调用对象属性,只能调用类属性

  • 静态方法

 - 啥都不能调用,不能获取对象属性,也不能获取类属性
 - 只是寄生在我们这个类上而已
不同于之前的:
1:

person = Person()
        flag = random.randrange(100)
        person.p_name = 'tom%d' % i
        person.p_age = flag
        person.p_sex = flag % 2
        person.save()

和2:

 person = Person.objects.create(p_name='张三', p_age=15, p_sex=True)

 person.save()

这次操作方法是创建类方法去创建对象
我们在models中添加类方法

@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_sex=p_sex, p_hobby=p_hobby)

然后我们在views中调用我们的类方法去创建对象

def add_person(request):

    # person = Person.objects.create(p_name='张三', p_age=15, p_sex=True)
    person = Person.create('jack')
    person.save()
最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏