Django(3)模型

2023-05-16

文章目录

  • 一、Django 模型——ORM
  • 二、数据库配置
  • 三、定义模型(创建数据表)
  • 四、数据库基本操作
    • - 插入数据
    • - 获取数据
      • (1)查询所有的数据行
      • (2)where条件查询
      • (3)获取单个对象
      • (4)限制返回的数据
      • (5)数据排序
      • (6)混合查询
    • - 更新数据
    • - 删除数据

此文章参考菜鸟教程:Django 模型 | 菜鸟教程 (runoob.com)
Django版本:

>>> django.VERSION  
(4, 1, 0, 'final', 0)

下面使用数据库为Mysql5.7
PS:基于前几章的进度进行修改

一、Django 模型——ORM

  • Django对各种数据库都提供了很好的支持,例如:PostgreSQL、Mysql、Oracle等。并且Django为这些数据库提供了统一的API,也就是说我们调用不同的数据库时,只需要使用一种方式即可
  • Django 模型使用自带的ORM用于实现面向对象编程语言中不同类型系统数据之间的转换

对象关系映射(Object Relational Mapping,简称ORM):ORM模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

  • 下面是菜鸟提供的示例图:

在这里插入图片描述

  • ORM的优缺点:

优点

  1. 提高开发效率
  2. 不同数据库可以平滑切换

缺点

  1. ORM代码转换成SQL语句时,需要花费一定的时间,会降低执行效率
  2. 长期写ORM代码,会降低SQL语句的能力
  • ORM解析过程:
  1. ORM会将Python代码转换成SQL语句
  2. SQL语句通过pymysql传送到数据库服务端
  3. 在数据库执行SQL语句并且返回结果
  • 菜鸟提供的ORM对应关系表

在这里插入图片描述

二、数据库配置

  • Django配置mysql数据库,在项目的settings.py文件中找到DATABASES配置项进行修改
#这之前先部署一个mysql,创建一个库
mysql> create database test default charset=utf8;
Query OK, 1 row affected, 1 warning (0.00 sec)


#然后再修改
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

#修改为:
DATABASES = {
    'default':
    {
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'test', # 数据库名称
        'HOST': '10.10.30.69', # 数据库地址,本机 ip 地址 127.0.0.1 
        'PORT': 3306, # 端口 
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'fosafer.com', # 数据库密码
    }
}
  • 然后修改项目目录中的__init__.py文件,导入mysql模块
import pymysql
pymysql.install_as_MySQLdb()
  • 这时可能会报错,找不到模块pymysql,可以安装一下
(test) PS F:\django\helloworld> pip install pymysql  #安装
Collecting pymysql
  Using cached PyMySQL-1.0.2-py3-none-any.whl (43 kB)
Installing collected packages: pymysql
Successfully installed pymysql-1.0.2
WARNING: You are using pip version 22.0.4; however, version 22.2.2 is available.
You should consider upgrading via the 'F:\django\test\Scripts\python.exe -m pip install --upgrade pip' command.
  • 重新启动django,没报错就表示数据连接成功
(test) PS F:\django\helloworld> python .\manage.py runserver 0.0.0.0:8000  #启动
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.   #可以看到这里提示要输入的命令
August 18, 2022 - 11:20:59
Django version 4.1, using settings 'helloworld.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.

三、定义模型(创建数据表)

  • 每个模型都是Python的一个,这些类继承django.db.models.Model。而每个类的属性都相当于是一个数据库的字段,也就是说模型中每个类代表一张表,而类的属性是表的字段

  • Django规定,如果要使用模型,就必须创建一个app,使用django-admin startapp TestModel可以创建一个名叫TestModel的app

(test) PS F:\django\helloworld> django-admin startapp TestModel
(test) PS F:\django\helloworld> ls


    目录: F:\django\helloworld


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2022/8/17     14:17                helloworld
d-----         2022/8/18     10:45                static
d-----         2022/8/17     14:17                templates
d-----         2022/8/18     13:57                TestModel  #创建了一个TestModel的目录
-a----         2022/8/17     10:49              0 db.sqlite3
-a----         2022/8/17     10:49            688 manage.py

(test) PS F:\django\helloworld> cd TestModel     #进入目录
(test) PS F:\django\helloworld\TestModel> ls  #查看目录结构


    目录: F:\django\helloworld\TestModel


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2022/8/18     13:57                migrations
-a----         2022/8/18     13:57             66 admin.py
-a----         2022/8/18     13:57            156 apps.py
-a----         2022/8/18     13:57             60 models.py
-a----         2022/8/18     13:57             63 tests.py
-a----         2022/8/18     13:57             66 views.py
-a----         2022/8/18     13:57              0 __init__.py

  • 修改models.py文件
from django.db import models

class Aaa(models.Model):
    name = models.CharField(max_length=20)
    age = models.CharField(max_legth=3)

解析:

  1. 上面定义的类名称Aaa,代表了数据库的表名
  2. Test类继承了models.Model
  3. 类中的字段代表数据表中的字段,也就是name,数据类型有CharField(相当于varchar)DateField(相当于datetime),而max_length参数用来限定长度

最终会创建一个名叫TestModel_aaa的表,名称是app+类的名称组成的,表中的字段有name,name字段的数据类型为varchar,限制20个长度,相当于下面的sql语句:

注意:如果没有设置主键,那么django会自动添加一个id的主键

CREATE TABLE TestModel_aaa(
    "id" serial NOT NULL PRIMARY KEY,
	"name" varchar(20) NOT NULL,
    "age" varchar(3) NOT NULL
);
  • 修改settings.py文件使用创建的模型

创建模型之后需要告诉Django,在setting.py文件中,添加app,添加新创建模型名称即可

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TestModel',  #添加新的app
]
  • 在命令行中运行,先把后台关掉
(test) PS F:\django\helloworld> python manage.py migrate #执行对模型修改的操作

- 执行上面的命令后,查看mysql数据库,可以发现已经创建了数据表
mysql> show tables;
+----------------------------+
| Tables_in_test             |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
10 rows in set (0.00 sec)


- 下面来创建TestModel模型的表
(test) PS F:\django\helloworld> python manage.py makemigrations TestModel #对操作进行记录,后面可以指定模型
#输出:
    - Create model Aaa
    
(test) PS F:\django\helloworld> python manage.py migrate TestModel #执行对指定模型的修改
#输出:
	Applying TestModel.0001_initial... OK

- 再次查看数据库,发现创建了TestModel_aaa 表
mysql> show tables;
+----------------------------+
| Tables_in_test             |
+----------------------------+
| TestModel_aaa              |  #创建的表
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
11 rows in set (0.00 sec)

- 查看表结构,可以看到 id 字段为主键
mysql> show create table TestModel_aaa;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table         | Create Table                                                                                                                                                                                    |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TestModel_aaa | CREATE TABLE `TestModel_aaa` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `age` varchar(3) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> describe TestModel_aaa;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | NO   |     | NULL    |                |
| age   | varchar(3)  | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

四、数据库基本操作

- 插入数据

  • HelloWorld容器目录下添加testdb.py文件,并修改urls.py文件
- 修改HelloWorld/HelloWorld/urls.py 文件
#-*- coding: utf-8 -*-
from django.urls import path

from . import index_test,testdb  #导入模块

urlpatterns = [
    path('hello/',index_test.Hello),
    path('testdb/',testdb.testdb)   #添加新资源
]

- 添加HelloWorld/HelloWorld/testdb.py 文件
#添加数据需要先创建对象,然后执行`save`函数进行保存,相当于`INSERT`SQL语句
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa  #对应TestModel模型的Aaa类

def testdb(request):
    test1 = Aaa(name="zhangsan",age="34")  #创建对象,设置对象属性
    test1.save()
    return HttpResponse("<p>数据添加成功!!!!</p>")

  • 启动服务,访问资源页面testdb
(test) PS F:\django\helloworld> python .\manage.py runserver 8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
August 19, 2022 - 16:33:21
Django version 4.1, using settings 'helloworld.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
  • 访问IP:8000/testdb

在这里插入图片描述

  • 去数据库查看,发现添加成功

在这里插入图片描述

- 获取数据

  • 上面的testdb.py编写的是插入数据,下面来看查询数据

(1)查询所有的数据行

- 修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    response = ""       #提前定义空字符串
    response_id = ""
    response1 = ""
    response2 = ""

    list = Aaa.objects.all()  #查询所有数据行, 相当于 select * from table; 返回一个QuerySet对象,
    for i in list:    
        response1 = i.id   
        response2 += i.name + " " + i.age + ""   
    
    response = response2
    response_id = str(response1)  #把int类型转换成字符串
    return HttpResponse("<p>" + response_id + " "  + response + "</p>")
  • 访问IP:8000/testdb

在这里插入图片描述

(2)where条件查询

- 现在数据库中,手动增加几条数据,以便看到效果:
mysql> insert into TestModel_aaa values(2,"lisi","22");
Query OK, 1 row affected (0.06 sec)

mysql> insert into TestModel_aaa values(3,"wangwu","55");
Query OK, 1 row affected (0.08 sec)

mysql> select * from TestModel_aaa;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | zhangsan | 34  |
|  2 | lisi     | 22  |
|  3 | wangwu   | 55  |
+----+----------+-----+
3 rows in set (0.00 sec)


- 修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    response = ""
    response_id = ""
    response1 = ""
    response2 = ""

    list = Aaa.objects.filter(id=3)   #相当于在 select 时添加where过滤

    for i in list:
        response1 = i.id
        response2 += i.name + " " + i.age + ""
    
    response = response2
    response_id = str(response1)
    return HttpResponse("<p>" + response_id + " "  + response + "</p>")
    
  • 访问

在这里插入图片描述

  • 再次修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    response = ""
    response_id = ""
    response1 = ""
    response2 = ""

    list = Aaa.objects.filter(name="lisi")

    for i in list:
        response1 = i.id
        response2 += i.name + " " + i.age + ""
    
    response = response2
    response_id = str(response1)
    return HttpResponse("<p>" + response_id + " "  + response + "</p>")
    
  • 访问

在这里插入图片描述

(3)获取单个对象

- 修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    list = Aaa.objects.get(id=3)
    return HttpResponse("<p>" + str(list.id) + list.name + list.age +"</p>")
  • 使用get获取的是单个对象,不是可迭代数据,所以可以直接取值,下面来访问一下

在这里插入图片描述

(4)限制返回的数据

- 注释
offset 1:表示跳过第1行,因为是根据下标,所以第一行数据行是0开始
limit 2:表示获取前两行


- 下面修改testdb.py文件
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    response = ""
    response1 = ""

    list = Aaa.objects.order_by("name")[0:2] #限制返回的数据,相当于SQL中的offset 0 limit 2,也就是跳过0行,输出前1行
    for i in list:
        response1 += i.name + " "

    response = response1
    return HttpResponse("<p>" + response + "</p>")
    
  • 访问,可以看到,显示的是前两行
    在这里插入图片描述

  • 再次修改进行访问

# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    response = ""
    response1 = ""

    list = Aaa.objects.order_by("name")[1:2] #相当于SQL中的offset 1 limit 2,也就是跳过第一行,输出前2行,因为跳过了一行,所以最终输出1行
    for i in list:
        response1 += i.name + " "

    response = response1
    return HttpResponse("<p>" + response + "</p>")
    

在这里插入图片描述

(5)数据排序

- 修改testdb.py文件
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    response = ""
    response_id = ""
    response1 = ""
    response2 = ""

    list = Aaa.objects.order_by("id")  #按照指定字段,从小到大排序

    for i in list:
        response1 += str(i.id)
        response2 += i.name + " " + i.age + " "
    
    response = response2
    response_id = response1
    return HttpResponse("<p>" + response_id + " " + response +  "</p>")
    
  • 访问
    在这里插入图片描述

  • 上面是从小到大,下面是从大到小

- 修改testdb.py文件
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    response = ""
    response_id = ""
    response1 = ""
    response2 = ""

    list = Aaa.objects.order_by("-id")  #按照指定字段,从小到大排序,前面加 - 

    for i in list:
        response1 += str(i.id)
        response2 += i.name + " " + i.age + " "
    
    response = response2
    response_id = response1
    return HttpResponse("<p>" + response_id + " " + response +  "</p>")
    
  • 访问

在这里插入图片描述

(6)混合查询

- 往数据库添加数据
mysql> insert into TestModel_aaa values(4,"lisi","22");
Query OK, 1 row affected (0.15 sec)

mysql> select * from TestModel_aaa;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | zhangsan | 34  |
|  2 | lisi     | 22  |
|  3 | wangwu   | 55  |
|  4 | lisi     | 22  |
+----+----------+-----+
4 rows in set (0.00 sec)


- 修改testdb.py文件
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    response = ""
    response_id = ""
    response1 = ""
    response2 = ""

    list = Aaa.objects.filter(name="lisi").order_by("id")  #where查询name等于lisi的,然后通过id进行从小大到大排序
    for i in list:  
        response1 += str(i.id)
        response2 += i.name + " " + i.age + " "
    
    response = response2
    response_id = response1
    return HttpResponse("<p>" + response_id + " " + response +  "</p>")
    
  • 访问

在这里插入图片描述

- 更新数据

  • 更新数据和插入数据类似
- 修改testdb.py文件
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    test1 = Aaa.objects.get(id=1)  #获取id为1的数据行作为单个对象
    test1.name = "liuliu"  #修改对象的name字段为liuliu,也就是修改对象的属性
    test1.save()   #最后保存

    return HttpResponse("<p>修改成功</p>")
  • 访问

在这里插入图片描述

  • 查看数据库,发现数据成功修改!

在这里插入图片描述

  • 除了上面使用的方法,还有另一种方式:
- 修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    Aaa.objects.filter(id=2).update(name="wuwuwu")  #利用filter筛选数据行,然后使用update方法直接修改指定字段

    return HttpResponse("<p>修改成功</p>")
  • 访问

在这里插入图片描述

  • 查看数据库,发现成功修改

在这里插入图片描述

  • 上面是根据条件修改,下面来看修改所有的列,与上面的方法同理,修改指定数据行使用filter那么修改全部就是all
- 修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    Aaa.objects.all().update(age="120")

    return HttpResponse("<p>全部修改成功</p>")
  • 访问

在这里插入图片描述

  • 查看数据库,发现修改成功

在这里插入图片描述

- 删除数据

  • 删除数据和修改数据差不多,只不过是把update换成delete,下面直接来看两种方法

  • 一种,先取出指定对象,然后删除

- 修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    test1 = Aaa.objects.get(id=1)
    test1.delete()

    return HttpResponse("<p>删除成功!!</p>")
  • 访问并确认

在这里插入图片描述

在这里插入图片描述

  • 第二种直接使用delete方法删除
- 修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    Aaa.objects.filter(id=2).delete()

    return HttpResponse("<p>删除成功!!</p>")
  • 访问并确认

在这里插入图片描述

在这里插入图片描述

  • 删除全部也是同理
- 修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa

def testdb(request):
    Aaa.objects.all().delete()

    return HttpResponse("<p>删除全部成功!!</p>")
  • 访问并确认

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django(3)模型 的相关文章

随机推荐

  • 初识C语言(1)

    这是对C语言的大概了解 一 什么是C语言 对于日常生活中 xff0c 任何人交流的会通过中文 xff0c 英文 来交流 xff0c 这些都是语言 xff0c 而计算机语言就是任何计算机交流的语言 xff08 C语言 xff0c c 43 4
  • Git的图形化界面如何使用

    一 什么是Gitee gitee https gitee com xff08 中文名 xff1a 码云 xff0c 原名 Git 64 OSC xff09 是开源中国推出的基于git的代码托管服务 国内访问GitHub https gith
  • 重要性抽样方法实例分享

    经过matlab爱好者公众号连续不断的推送Monte Carlo方法 xff0c 所以我们对其了解透彻了吗 xff1f NO xff01 当然还得日日精进 大家经常使用的Monte Carlo方法并不完美 xff0c 我估计大多数人也听不懂
  • 你们要的网页版matlab来了,速领!

    近来有不少小伙伴在公众号里面问网页版matlab xff0c 之前公众号确实是在菜单中给大家分享过一款网页版matlab编译环境 xff0c 不过由于公众号菜单更新换代 xff0c 已经将相关分享入口给取消了 xff0c 为了让大家更加方便
  • RHEL本地登录login出现permission denied的可能的解决办法

    OS xff1a RHEL7 6 开机后发现在本地使用root和非root用户登录 xff0c 输入用户名密码后 xff0c 都会出现permission denied xff0c 没有办法进入到系统 在网上查了很多资料 xff0c 看到这
  • Updating crates.io index 速度慢的解决办法

    Rust社区公开的第三方包都集中在crates io网站上面 xff0c 他们的文档被自动发布到doc rs网站上 Rust提供了非常方便的包管理器cargo xff0c 它类似于Node js的npm和Python的pip 但cargo不
  • SecureCRT 密码解密

    SecureCRT xff08 8 以上 xff09 配置的密码存放在 Config Sessions下面的ini文件中 xff0c 内容如下 xff1a S Username 61 S Monitor Password V2 61 S P
  • AD10 四层板经验(层的性质)

    层的性质 xff1a 内部层有两种 xff1a plane和layer xff0c 他们的区别如下 xff1a plane是所有Layer的其中一个 xff0c Layer是指层 xff0c 例如有常见的信号层Signal Layers 顶
  • Centos7下httpd最新版本安装或者更新至最新版本

    查找Centos上软件库里的httpd版本 yum info httpd yum info httpd 已加载插件 xff1a fastestmirror Loading mirror speeds from cached hostfile
  • 修改git远程仓库地址

    由于git仓库的地址发生了变化 xff0c 需要修改仓库地址才能push 查看本地工程git仓库关联的远程仓库地址 xff1a span class token function git span remote v 删除本地关联的远程仓库地
  • INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法

    在Android模拟器上安装apk的时候出现 xfeff xfeff INSTALL FAILED NO MATCHING ABIS 这个错误提示的解决办法 是由于使用了native libraries 该native libraries
  • IntelliJ IDEA 控制台中文乱码

    1 预热 刚刚接触IntelliJ IDEA几天 xff0c 在易用性方面的确比Eclipse好很多 xff0c 比较智能 xff0c 各种插件 工具都已经集成 xff0c 和Mac OS X类似 开箱即用 但是还是老大难问题 中文乱码 x
  • unable to start the monitor on 4454 ,an other instance is problaly using the same port

    在打开idea studio后 xff0c 再打开android studio xff0c 或者反过来 xff0c 打开项目的时候就会报 xff1a unable to start the monitor on 4454 xff0c an
  • windows中为cmd设置代理

    在CMD环境下设置代理可能不是很常用 xff0c 但是某些情况下还是可能会用到 xff0c 比如有些资源网站被墙了 xff0c 此时你如果想访问这些资源时 xff0c 只能通过代理来访问相应的资源 xff0c 而你需要在CMD环境下下载墙外
  • version `GLIBCXX_3.4.21' not found 解决办法

    在安装cmake3 5 1运行 bootstrap的时候出现如下提示 xff1a gmake cmake 是最新的 span class hljs header usr soft cmake 3 5 1 Bootstrap cmk cmak
  • Oracle死锁查询及处理

    一 数据库死锁的现象 程序在执行的过程中 xff0c 点击确定或保存按钮 xff0c 程序没有响应 xff0c 也没有出现报错 二 死锁的原理 当对于数据库某个表的某一列做更新或删除等操作 xff0c 执行完毕后该条语句不提 交 xff0c
  • Ubuntu 18.04添加中文输入法

    找到设置 xff1a 点击 Manager Installed Languages 出现下图提示 xff1a Keyboard input method system 里面有Ibus XIM fcitx none 三种输入架构 xff0c
  • KEIL问题【打开文件太多造成任何按钮都不可点】【Keil4 编译时出现RL-ARM is not allowed with this license 】【 局部变量仿真显示not in scope】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC xff0c 集成了高性能2 4GHz射频收发机 32位ARM Cortex M0处理器 128kB Flash存储器 以及丰富的数字接口 SYD8801片上集成了Balun无需阻抗匹配网络
  • Django(2)模板、标签

    文章目录 一 使用Django模板修改页面二 Django模板标签 变量 列表 字典 过滤器1 default2 length3 filesizeformat4 date5 truncatechars6 safe if else标签 for
  • Django(3)模型

    文章目录 一 Django 模型 ORM二 数据库配置三 定义模型 xff08 创建数据表 xff09 四 数据库基本操作 插入数据 获取数据 xff08 1 xff09 查询所有的数据行 xff08 2 xff09 where条件查询 x