Django框架

这篇具有很好参考价值的文章主要介绍了Django框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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框架,目录结构如下:

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)工具右边添加数据库

Django框架

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类。

注册子应用:

Django框架

 并引入子应用路由

Django框架

类型 说明
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、创建表

Django框架

迁移文件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 插件文章来源地址https://www.toymoban.com/news/detail-433700.html

到了这里,关于Django框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包