Django框架

一、如何解决组件不是内部或批处理命令

1、如果要使用pip,需要设置环境变量,添加比如D:\Python36\Scripts,因为pip在Scripts目录下

2、如何查找django全局目录pip show django

二、创建django框架(MTV)

pip install django#安装django框架,Scripts目录新增文件

cd 工程目录#跳转工程目录

pip show django#获取框架目录,添加到全局变量

django-admin --version#查看是否安装成功

django-admin#查看组件

django-admin startproject 工程名称#创建工程目录

python manage.py runserver IP PORT#不加后两项自动默认设置,启动项目

python manage.py startapp app01#创建app应用,可有可没有此步骤,根据项目情况创建。如果创建请在settings->INSTALLED_APPS里面加上新创建的app名字

以上步骤就创建了一个django框架,目录结构如下:

注:除了djangopro这个外部文件目录,其他文件名不要改动,否则会报错。

app01:应用文件夹,为了解耦设计,可以有多个这样的目录

asgi.py:异步处理文件

settings.py:全局配置文件,全局参数都在这里配置

templates:存放模板文件

3、模板渲染,HttpResponse直接把命令渲染到空白页面,render渲染数据到html页面

from django.shortcuts import render, HttpResponse


# Create your views here.
def epidemic(request):
    return render(request, 'epidemic.html', {'timer': '20220501'})


def article(request, year, month):
    return render(request, 'article.html', {'year': year, 'month': month})


def date_01(request):
    return HttpResponse("this is a template")

html数据渲染:

{% for i in test %}
{% forloop.first %}<!--第一个循环 -->
{% forloop.last %}<!--最后一个循环 -->
{% forloop.counter %}<!--循环数 -->
    {% if i == 1 %}
        <p>我是1</p>
    {% elif  i == 2 %}
        <p>我是2</p>
    {% elif i is test1 %}
        我是一个对象
    {% else %}
        <p>我是其他</p>
    {% endif %}
{% endfor %}

{{ timer }} 数据渲染

继承渲染:

#base.html
{% block content %}
这是基本内容块
{% endblock %}

#其他html文件
{% block content %}
    this is 引用base模板的其他部分,content是需要替换成自己专属的页面
{% endblock %}

三、路由控制器

1、正则路由,路由分发,反向解析

#主路由
from django.contrib import admin
from django.urls import path, re_path, include


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

    # 正则^$建议加上开始和结束标志
    # re_path('article/\d+',article)
    # 路由分发
    path('app01/', include('app01.urls'))


]

#分路由
from django.urls import path, re_path
from . import views

urlpatterns = [
    path('epidemic/', views.epidemic),
    #正则路由,反向解析
    re_path(r'^article/(?P<year>\d{4})/(?P<month>\d{0,3})/$', views.article, name='app01_article')

]

四、模型层(orm)

O(object) 对象 

R(relation) 关系

M (mapping) 映射

orm优点:语义清晰,代码量少,方便更新维护,缺点:非轻量级,比原生sql复杂,无法了解底层

解决方式:可以使用其他数据库

pymysql另外操作即可,用了ORM并不表示当前项目不能使用别的数据库操作工具了

1、mysql数据库

1)安装驱动程序pymysql

pip install PyMySQL

2)在工程同名的文件夹中__init__.py文件中添加如下语句

from pymysql import install_as_MySQLdb
install_as_MySQLdb() # 让pymysql以MySQLDB的运行模式和Django的ORM对接运行

3)全局配置文件setting.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 数据库主机
        'PORT': 3306,  # 数据库端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '123456',  # 数据库用户密码
        'NAME': 'erp_ada'  # 数据库名字
    }
}

4)创建数据库

create database student default charset=utf8mb4; # mysql8.0之前的版本

 2、sqlite数据库配置(Django自带数据库)

1)假如出现os问题,一般是settings文件没有引入os,直接import os即可

2)使用sqlite3数据库的settings文件设置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

3)工具右边添加数据库

4)数据库更新

构造表结构数据库python manage.py makemigrations

迁移数据库python manage.py migrate

3、如果想打印orm转换过程中的sql,需要在settings中进行如下配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}  

 6、定义模型类

  • 模型类被定义在"子应用/models.py"文件中。
  • 模型类必须直接或者间接继承自django.db.models.Model类。

注册子应用:

 并引入子应用路由

类型说明
AutoField自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
BooleanField布尔字段,值为True或False
NullBooleanField支持Null、True、False三种值
CharField字符串,参数max_length表示最大字符个数,对应mysql中的varchar
TextField大文本字段,一般大段文本(超过4000个字符)才使用。
IntegerField整数
DecimalField十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数,常用于表示分数和价格 Decimal(max_digits=7, decimal_places=2) ==> 99999.99~ 0.00
FloatField浮点数
DateField日期参数auto_now表示每次保存对象时,自动设置该字段为当前时间。参数auto_now_add表示当对象第一次被创建时自动设置当前。参数auto_now_add和auto_now是相互排斥的,一起使用会发生错误。
TimeField时间,参数同DateField
DateTimeField日期时间,参数同DateField
FileField上传文件字段,django在文件字段中内置了文件上传保存类, django可以通过模型的字段存储自动保存上传文件, 但是, 在数据库中本质上保存的仅仅是文件在项目中的存储路径!!
ImageField继承于FileField,对上传的内容进行校验,确保是有效的图片

选项说明
null如果为True,表示允许为空,默认值是False。相当于python的None
blank如果为True,则该字段允许为空白,默认值是False。 相当于python的空字符串,“”
db_column字段的名称,如果未指定,则使用属性的名称。
db_index若值为True, 则在表中会为此字段创建索引,默认值是False。 相当于SQL语句中的key
default默认值,当不填写数据时,使用该选项的值作为数据的默认值。
primary_key如果为True,则该字段会成为模型的主键,默认值是False,一般不用设置,系统默认设置。
unique如果为True,则该字段在表中必须有唯一值,默认值是False。相当于SQL语句中的unique

五、ORM->pymysql的增删改查

1、创建表

迁移文件models.py

python manage.py makemigrations

同步到数据库中

python manage.py migrate

 2、添加数据

#方法一:
 #erp = models.ErpList(
      #  name="定时器",
       # type="无效定时",
       # amon=40,
       # price=300.08,
       # warehouse="加字号1仓"
   # )
   # erp.save()

#方法二:
    erp = models.ErpList.objects.create(
        name="定时器2",
        type="无效定时2",
        amon=40,
        price=300.08,
        warehouse="加字号2仓"
    )

2、查询数据

 返回queryset数据

students = Student.objects.all()

查询符合条件的数据(queryset)

students = Student.objects.filter(sex=0)

 查询符合条件的一条数据,0条或者多条返回错误(model)

student = Student.objects.get(name="刘德华")

返回第一条或者最后一条数据(model)

stu01 = Student.objects.first()
stu02 = Student.objects.last()

 查询不符合条件的一条数据(queryset)

students = Student.objects.exclude(name="张三")

查询数据进行排序

students = Student.objects.filter(sex=1).order_by("-age", "-id")

 查询数据总个数

count = Student.objects.filter(sex=1).count()

按照需求进行列的返回 

ret1 = student_list.values() # 默认把所有字段全部转换并返回
ret2 = student_list.values("id","name","age") # 可以通过参数设置要转换的字段并返回
ret3 = student_list.values_list() # 默认把所有字段全部转换并返回
ret4 = student_list.values_list("id","name","age") # 可以通过参数设置要转换的字段并返回

3、修改数据

方法一:

student = Student.objects.filter(name='刘德华').first()
print(student)
student.age = 19
student.classmate = "303"
# save之所以能提供给我们添加数据的同时,还可以更新数据的原因?
# save会找到模型的字段的主键id的值,
# 主键id的值如果是none,则表示当前数据没有被数据库,所以save会自动变成添加操作
# 主键id有值,则表示当前数据在数据库中已经存在,所以save会自动变成更新数据操作
student.save()

方法二:

返回受影响的行数

student = Student.objects.filter(name="赵华",age=22).update(name="刘芙蓉",sex=True)

 4、删除数据

# 1. 先查询到数据模型对象。通过模型对象进行删除
# student = Student.objects.filter(pk=13).first()
# student.delete()

# 2. 直接删除
ret = Student.objects.filter(pk=100).delete()
print(ret)
# 务必写上条件,否则变成了清空表了。ret = Student.objects.filter().delete()

pycharm免费使用参考:IDEA安装IDE Eval Reset插件_CVPR收割机的博客-CSDN博客_idea reset 插件

  • 17
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值