DJango知识-模型类

 一.项目创建

  1. 在想要将项目创键的目录下,输入cmd   (进入命令提示符)
  2. 在cmd中输入:Django-admin startproject 项目名称  (创建项目)
  3. cd 项目名称  (进入项目)
  4. Django-admin startapp 程序名称  (创建程序)
  5. python manage.py runserver 8080  (运行程序)
  6. 将弹出的网址复制到浏览器中http://127.0.0.1:8080/ 

当出现这个界面时说明运行成功了

二.设置settings

一.installed_apps

在INSTALLED_APPS中将我们创建的myday程序名称输入

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','myday'
]

二.templates

在根目录下创建templates文件夹,并将TEMPLATES中的'DIRS'修改为如图所示

TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR,'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]

三.databases

在DATABASES中按如下格式输入,将数据库改为MYSQL数据库

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': '数据库名','USER': 'root','PASSWORD': 'MYSQL密码','HOST': '127.0.0.1','PORT': '3306',        }
}

 注意:因为在python3中mysql改名为pymysql所以需要在主目录下的_init_中输入

import pymysql
pymysql.install_as_MySQLdb()

四.汉化

最后这样进行汉化处理

LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/shanghai'

三.模型类设置

1.字段类型

  1. AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
  2. BooleanField:布尔字段,值为True或False
  3. NullBooleanField:支持Null、True、False三种值
  4. CharField(max_length=字符长度):字符串,必选 参数max_length表示最大字符个数
  5. TextField:大文本字段,一般超过4000个字符时使用
  6. IntegerField:整数
  7. DecimalField(max_digits=None, decimal_places=None):十进制浮点数参数max_digits表示总位数,参数decimal_places表示小数位数
  8. FloatField:浮点数
  9. DateField[auto_now=False, auto_now_add=False]):日期 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false,参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false,参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
  10. TimeField:时间,参数同DateField
  11. DateTimeField:日期时间,参数同DateField
  12. FileField:上传文件字段
  13. ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片

关系型数据库的关系包括三种类型:

  • ForeignKey:一对多,将字段定义在多的一端中
  • ManyToManyField:多对多,将字段定义在两端中
  • OneToOneField:一对一,将字段定义在任意一端中

2.定义模型-models

from django.db import models
# Create your models here.
class Tag(models.Model):Tag_name = models.CharField(max_length=50, unique=True)def __str__(self):return self.Tag_nameclass Meta:verbose_name_plural = '标签名'class Category(models.Model):Category_name = models.CharField(max_length=50, unique=True)def __str__(self):return self.Category_nameclass Meta:verbose_name_plural = '分类名'class Post(models.Model):title = models.CharField("题目", max_length=50, unique=True)content = models.TextField("内容")author = models.CharField("作者", max_length=200, default="郭十一")tag = models.ManyToManyField(Tag)category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)  # 这里的NULL表示,数据分类可以为空def __str__(self):return self.titleclass Meta:verbose_name_plural = "内容"

 Meta既对如下进行的修改显示

3.定义模型-admin

 在注册这三个表时,admin会自行运行里面的方法,所以不用调用

from django.contrib import admin
from .models import Category, Post,Tag
#第二种注册表的方法:admin.site.register(Category)@admin.register(Post)
class PostAdmin(admin.ModelAdmin):#显示设置list_display = ['title','content','author','display_tag','display_category']  #因为不能显示多对多,所以要美化#区块设置fieldsets =(("标题/正文", {'fields': ['id','title', 'content'], 'classes': ['collapse']}),("作者", {'fields': ['author'], 'classes': ['collapse']}),("分类/标签", {'fields': ['tag','category'], 'classes': ['collapse']}),)#搜索功能search_fields = ['title', 'content','author','category__Category_name','tag__Tag_name']#过滤功能list_filter = ['author','category','tag']#分页功能list_per_page = 3def display_tag(self, obj):return "/".join([tag.Tag_name for tag in obj.tag.all()])display_tag.short_description = "标签"def display_category(self, obj):return obj.category.Category_namedisplay_category.short_description = "分类"class PostInlines(admin.StackedInline):   #StackedInline是上下布局,TabularInline左右布局model = Post   #关联的类extra = 3      #空白3篇@admin.register(Category)   #第二类注册方式
class CategoryAdmin(admin.ModelAdmin):list_display = ('display_category','id')  #与PostAdmin相同,显示设置,需要自定义方法def display_category(self, obj):return obj.Category_namedisplay_category.short_description = "分类"@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):list_display = ('display_tag','id')  #与PostAdmin相同,显示设置,需要自定义方法def display_tag(self, obj):return obj.Tag_namedisplay_tag.short_description = "标签"

使用display_tag方法自定义的列名,并使用list_display显示

4.模型类成员

  • save():将模型对象保存到数据表中
  • delete():将模型对象从数据表中删除

1.方法一:

在views中,编写视图函数进行数据的保存与删除

from django.shortcuts import render,HttpResponse
from .models import *def save_tag(request,tag_name):tag = Tag()tag.Tag_name = tag_nametag.save()return HttpResponse(f"已成功添加{tag_name}")def delete_tag(request,tag_name):tag = Tag.objects.get(Tag_name=tag_name)tag.delete()return HttpResponse(f"已成功删除{tag_name}")

 配置主路由

from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('',include('myday.urls')),
]

再使用正则配置子路由

from django.contrib import admin
from django.urls import path,include,re_path
from .views import *
urlpatterns = [re_path(r"save_tag/(\w+)",save_tag),re_path(r"delete_tag/(\w+)",delete_tag)
]

2.方法二:

自定义管理器类主要用于两种情况 :

  1. 修改原始查询集,重写get_queryset()方法
  2. 向管理器类中添加额外的方法,如创建对象

models中进行自定义管理器的编写

from django.db import models# Create your models here.
class PostManage(models.Manager):def get_queryset(self):#return super(PostManage,self).get_queryset()  #不变return super(PostManage,self).get_queryset().filter(deleted=False) #只返回没有被逻辑删除的部分def create(self,title,content,author,category):p = self.model()  # 创建模型类对象self.model可以获得模型类p.title = titlep.content = contentp.author = authorp.category = categoryp.delete = Falsereturn p      # 返回模型对象class Post(models.Model):#...其他代码post_object = PostManage()

在视图中进行视图函数编写

def add_post(request):title = 'python 高级快速入门4'content = 'python 大法好'author = Post.post_object.get(id=1).author  # 作者# category = Category()  # 创建分类# category.category_name = 'python高级'# category.save()#或使用:因为在这两个表中的object没有被覆盖category, created = Category.objects.get_or_create(Category_name='Python高级'  # 尝试获取或创建)# 2. 同样的逻辑处理标签tag, created = Tag.objects.get_or_create(Tag_name='Python大法')# tag = Tag()  # 创建标签# tag.tag_name = 'python大法'# tag.save()p = Post.post_object.create(title,content,author,category)  #将带有数据的模型对象返回p.save()p.tag.add(tag) # 添加标签return HttpResponse('添加成功')

配置url

urlpatterns = [path("add_post",add_post)
]

5.查询集

1.返回列表的过滤器如下:

  • all():返回所有数据
  • filter():返回满足条件的数据
  • exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
  • order_by():排序,参数为字段名,-号表示降序
def show_post(request):All = Post.post_object.all()Filter = Post.post_object.filter(category__Category_name__contains='Python')exclude = Post.post_object.exclude(category__Category_name__contains='Python')order =Post.post_object.filter(category__Category_name__contains='Python').order_by('tag')print("返回全部:",All)print("返回分类包含Python的:",Filter)print("返回分类不包含Python的:",exclude)print("返回排序:",order)return HttpResponse("返回成功")
返回全部: <QuerySet [<Post: 1>, <Post: 2>, <Post: python 高级快速入门>, <Post: python 高级快速入门2>, <Post: python 高级快速入门3>, <Post: python 高级快速入门4>]>
返回分类包含Python的: <QuerySet [<Post: python 高级快速入门>, <Post: python 高级快速入门2>, <Post: python 高级快速入门3>, <Post: python 高级快速入门4>]>
返回分类不包含Python的: <QuerySet [<Post: 1>, <Post: 2>]>
返回排序: <QuerySet [<Post: python 高级快速入门>, <Post: python 高级快速入门2>, <Post: python 高级快速入门3>, <Post: python 高级快速入门4>]>

2.返回单个值的过滤器如下:

  • get():返回单个满足条件的对象 如果未找到会引发"模型类.DoesNotExist"异常 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常
  • count():返回当前查询的总条数
  • exists():判断查询集中是否有数据,如果有则返回True,没有则返回False

category__Category_name__contains:两个下滑线的意思类似于category.Category_name.contains

Post.post_object.all().count()
3
Post.post_object.all().exists()  # 查询结果集有数据,exists返回True
True 
Post.post_object.filter(id=1000).exists()  # 数据中不存在id为1000的数据,查询结果集为空,返回False
False

运算符如下:

exact:表示相等

contains:是否包含

startswith、endswith:以指定值开头或结尾

iexact,icontains,istartswith,iendswith功能同上面四个一样,前面加字母i表示不区分大小写。

isnull:是否为null

in:是否包含在范围内

gt:大于

gte:大于等于

lt:小于

lte:小于等于

exclude()方法:返回满足条件之外的数据,实现不等于效果

year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算

F对象 专门取对象中某列值的操作,F() 返回的实例用作查询内部对模型字段的引用。这些引用可以用于查询的filter 中来比较相同模型实例上不同字段之间值的比较。

Q对象 逻辑运算

注意:在django中查询条件的运算符采用两个下划线连接。 比如:

Post.post_object.filter(id__exact=1)  #查询条件:id等于1的数据

id大于1的数据:

Post.post_object.filter(id__gt=1)

翻译成sql语句为:

select * from Post where id>1;

演示:

  • exact 等于 查询id等于1的数据
Post.post_object.filter(id__exact=1)  #查询条件:id等于1的数据,注意是两个下划线

djago查询中条件查询默认使用exact运算符。 查询相等可简写:

Post.post_object.filter(id=1)
  • contains:是否包含 查询标题(title字段) 中包含'django'的文章
>>> Post.post_object.filter(title__contains='django')
<QuerySet [<Post: e10分钟入门django>, <Post: django 快速开发>]>
  • startswith、endswith:以指定值开头或结尾

查询标题中以python开头的文章

>>> Post.post_object.filter(title__startswith='python')
<QuerySet [<Post: python 高级快速入门>]>

查询标题中以django结尾的文章

>>> Post.post_object.filter(title__endswith='django')
<QuerySet [<Post: e10分钟入门django>]>
  • isnull:是否为null 如果数据库中有字段值为null的不能直接使用 '字段=null' 的方式查询,需要使用isnull判断值是否为null
>>> Post.post_object.filter(title__isnull=False)  #查询文章标题不为null的数据
<QuerySet [<Post: python 高级快速入门>, <Post: e10分钟入门django>, <Post: django 快速开发>]>
>>> Post.post_object.filter(title__isnull=True) <p>#查询文章标题为null的数据</p> 
<QuerySet []>
  • in:是否包含在范围内 查询id为2、3,4的文章,参数是一个列表,id在列表中,就是符合条件的。
>>> Post.post_object.filter(id__in=[2,3,4])
<QuerySet [<Post: e10分钟入门django>, <Post: django 快速开发>]>
  • gt:大于 查询id大于3 的文章
>>> Post.post_object.filter(id__gt=3)
<QuerySet [<Post: python 高级快速入门>, <Post: django 快速开发>]>
  • gte:大于等于 查询id大于等于3 的文章
>>> Post.post_object.filter(id__gte=3)
<QuerySet [<Post: python 高级快速入门>, <Post: e10分钟入门django>, <Post: django 快速开发>]>
  • lt:小于 查询id小于4的文章
>>> Post.post_object.filter(id__lt=4)
<QuerySet [<Post: e10分钟入门django>]>
  • lte:小于等于 查询id小于等于4的文章
>>> Post.post_object.filter(id__lte=4)
<QuerySet [<Post: e10分钟入门django>, <Post: django 快速开发>]>
  • year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算 查询2018年写的文章:
>>> Post.post_object.filter(created_time__year=2018)
<QuerySet [<Post: python 高级快速入门>, <Post: e10分钟入门django>]>

查询2018年之前写的文章

>>> Post.post_object.filter(created_time__year__lt=2018)
<QuerySet [<Post: django 快速开发>]>

查询2018年1月1日之后的文章

>>> Post.post_object.filter(created_time__gte=date(2018,1,1))

F对象

如果查询条件为两个属性值比较那么需要用到F对象。使用F对象,被定义在django.db.models中所有要使用F对象要先导入

导入F对象。

from django.db.models import F

F() 返回的实例用作查询内部对模型字段的引用。这些引用可以用于查询的filter 中来比较相同模型实例上不同字段之间值的比较。

>>> Post.post_object.filter(created_time=F('modified_time'))
<QuerySet [<Post: python 高级快速入门>]>

Django 支持对F() 对象使用加法、减法、乘法、除法、取模以及幂计算等算术操作,两个操作数可以都是常数和其它F() 对象。

比如:查询阅读量大于两倍评论量的数据

Post.post_object.filter(read__gt=F('comment')*2)

Q对象:Q对象,被定义在django.db.models中所有要使用Q对象要先导入

from django.db.models import Q

两个条件逻辑与运算在多个条件用逗号分隔就是逻辑与:

>>> Post.post_object.filter(title='django 快速开发',id__gt=2)
<QuerySet [<Post: django 快速开发>]>

如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符 Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或 Q对象使用~操作符,表示逻辑非,not

例如:查询标题以django结尾或者python开头的文章。这种逻辑或的关系,直接查询是没办法查询的,需要使用Q对象结合 | 查询

>>> Post.post_object.filter(Q(title__startswith='python') | Q(title__endswith='django'))
<QuerySet [<Post: python 高级快速入门>, <Post: e10分钟入门django>]>

相当于mysql中的语句:

WHERE title LIKE 'python%' OR title LIKE '%django'

查询 id不等于3的文章:

>>> Post.post_object.filter(~Q(id=3))
<QuerySet [<Post: python 高级快速入门>, <Post: django 快速开发>]>

3、关联查询

Django中也能实现类似于mysql中的连接查询。

关联模型类名小写属性名运算符=值

例如:查询分类为'django'的文章

>>> Category.objects.filter(post__title='django 快速开发')
<QuerySet [<Category: django>]>

查询分类为django的所有文章

>>> Post.post_object.filter(category__category_name='django')
<QuerySet [<Post: e10分钟入门django>, <Post: django 快速开发>]>

4、反向查询

如果模型I有一个ForeignKey,那么该ForeignKey 所指的模型II实例可以通过一个管理器返回前面有ForeignKey的模型I的所有实例。这个管理器的名字为foo_set,其中foo是源模型的小写名称。

>>> cg = Category.objects.filter(category_name='django')[0]
>>> cg
<Category: django>
>>> cg.post_set.all()
<QuerySet [<Post: e10分钟入门django>, <Post: django 快速开发>]>

5、聚合函数

使用aggregate()过滤器调用聚合函数, 常用聚合函数:Avg,Count,Max,Min,Sum,被定义在django.db.models中 需要使用要先导入聚合函数

聚合函数返回结果是一个字典:

>>> from django.db.models import Max
>>> Post.post_object.aggregate(Max('id')) # 查询文章表中id的最大值
{'id__max': 7}>>> from django.db.models import Min
>>> Post.post_object.aggregate(Min('id'))  # 查询文章表中id的最小值
{'id__min': 3}>>> from django.db.models import Avg
>>> Post.post_object.aggregate(Avg('id'))  # 查询所有文章id的平均数
{'id__avg': 4.666666666666667}
>>> from django.db.models import Count
>>> Post.post_object.aggregate(Count('id'))   #统计一共多少文章。
{'id__count': 3}
>>> from django.db.models import Sum
>>> Post.post_object.aggregate(Sum('id'))
{'id__sum': 14}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/83996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八股学习-JS的闭包

一.闭包的定义 闭包是指函数和其周围的词法环境的引用的组合。 简单来说&#xff0c;就是函数可以记住并访问其在定义时的作用域内的变量&#xff0c;即使该函数在其它作用域调用。 也就是说&#xff0c;闭包让你可以在一个内层函数中访问到其外层函数的作用域。 function …

qt使用笔记二:main.cpp详解

Qt中main.cpp文件详解 main.cpp是Qt应用程序的入口文件&#xff0c;包含程序的启动逻辑。下面我将详细解析其结构和功能。 基本结构 一个典型的Qt main.cpp 文件结构如下&#xff1a; #include <QApplication> // 或者 QGuiApplication/QCoreApplication #include &…

如何构建船舵舵角和船的航向之间的动力学方程?它是一个一阶惯性环节吗?

提问 船舵和船的航向之间的动力学方程是什么&#xff1f;是一个一阶惯性环节吗&#xff1f; 回答 船舵和船的航向&#xff08;航向角&#xff09;之间的动力学关系并不是一个简单的一阶惯性环节&#xff0c;虽然在某些简化控制模型中可以近似为一阶系统。实际上&#xff0c;…

抖去推--短视频矩阵系统源码开发

一、开发短视频矩阵系统的源码需要以下步骤&#xff1a; 确定系统需求&#xff1a; 根据客户的具体业务目标&#xff0c;明确系统需实现的核心功能模块&#xff0c;例如用户注册登录、视频内容上传与管理、多维度视频浏览与推荐、用户互动&#xff08;评论、点赞、分享&#xf…

Windows 下搭建 Zephyr 开发环境

1. 系统要求 操作系统&#xff1a;Windows 10/11&#xff08;64位&#xff09;磁盘空间&#xff1a;至少 8GB 可用空间&#xff08;Zephyr 及其工具链较大&#xff09;权限&#xff1a;管理员权限&#xff08;部分工具需要&#xff09; 2. 安装必要工具 winget安装依赖工具&am…

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…

安全月报 | 傲盾DDoS攻击防御2025年5月简报

引言 在2025年5月&#xff0c;全球数字化进程高歌猛进&#xff0c;各行各业深度融入数字浪潮&#xff0c;人工智能、物联网、大数据等前沿技术蓬勃发展&#xff0c;进一步夯实了数字经济的基石。然而&#xff0c;在这看似繁荣的数字生态背后&#xff0c;网络安全威胁正以惊人的…

【Spring】Spring哪些源码解决了哪些问题P1

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 Spring是怎么处理请求的&#xff1f;Spring请求方…

坚持每日Codeforces三题挑战:Day 4 - 题目详解(2025-06-07,难度:1000, 1100, 1400)

前言&#xff1a; 此文章主要是记录每天的codeforces刷题&#xff0c;还有就是给其他打算法竞赛的人一点点点点小小的帮助&#xff08;毕竟现在实力比较菜&#xff0c;题目比较简单&#xff0c;但我还是会认真写题解&#xff09;。 之前忙学校事情&#xff0c;懈怠了一段时间…

6.7本日总结

一、英语 复习默写list10list19&#xff0c;07年第3篇阅读 二、数学 学习线代第一讲&#xff0c;写15讲课后题 三、408 学习计组第二章&#xff0c;写计组习题 四、总结 本周结束线代第一讲和计组第二章&#xff0c;之后学习计网4.4&#xff0c;学完计网4.4之后开操作系…

PGSR : 基于平面的高斯溅射高保真表面重建【全流程分析与测试!】【2025最新版!!】

【PGSR】: 基于平面的高斯溅射高保真表面重建 前言 三维表面重建是计算机视觉和计算机图形学领域的核心问题之一。随着Neural Radiance Fields (NeRF)和3D Gaussian Splatting (3DGS)技术的发展&#xff0c;从多视角RGB图像重建高质量三维表面成为了研究热点。今天我们要深入…

从认识AI开始-----AutoEncoder:生成模型的起点

前言 从15年开始&#xff0c;在深度学习的重要模型中&#xff0c;AutoEncoder&#xff08;自编码器&#xff09;可以说是打开生成模型世界的起点。它不仅是压缩与重建的工具&#xff0c;更是VAE、GAN、DIffusion等复杂生成模型的思想起源。其实AutoEncoder并不复杂&#xff0c;…

解决MySQL8.4报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

最近使用了MySQL8.4 , 服务启动成功,但是就是无法登陆,并且报错: ERROR 1524 (HY000): Plugin mysql_native_password is not loaded 使用如下的命令也报错 mysql -u root -p -P 3306 问题分析: 在MySQL 8.0版本中,默认的认证插件从mysql_native_password变更为cachi…

TDengine 开发指南——无模式写入

简介 在物联网应用中&#xff0c;为了实现自动化管理、业务分析和设备监控等多种功能&#xff0c;通常需要采集大量的数据项。然而&#xff0c;由于应用逻辑的版本升级和设备自身的硬件调整等原因&#xff0c;数据采集项可能会频繁发生变化。为了应对这种挑战&#xff0c;TDen…

嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)

一、C有几种传值方式之间的区别 一、值传递&#xff08;Pass by Value&#xff09; 机制&#xff1a;创建参数的副本&#xff0c;函数内操作不影响原始数据语法&#xff1a;void func(int x)特点&#xff1a; 数据安全&#xff1a;原始数据不受影响性能开销&#xff1a;需要复…

Spark 之 AQE

个人其他链接 AQE 执行顺序https://blog.csdn.net/zhixingheyi_tian/article/details/125112793 AQE 产生 AQE 的 循环触发点 src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala override def doExecute(): RDD[InternalRow] = {withFin…

FSMC扩展外部SRAM

提示&#xff1a;文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 2025年6月7日 19:34:48 今天看了FSMC扩展外部SRAM的文章&#xff0c;大概理解到stm32除了内部存储器&#xff0c;还可以扩展外部存储器。其中s…

【CSS-6】深入理解CSS复合选择器:提升样式表的精确性与效率

CSS选择器是前端开发的基石&#xff0c;而复合选择器则是其中最强大且实用的工具之一。本文将全面解析CSS复合选择器的类型、用法、优先级规则以及最佳实践&#xff0c;帮助你编写更高效、更精确的样式表。 1. 什么是复合选择器&#xff1f; 复合选择器是通过组合多个简单选择…

使用python实现奔跑的线条效果

效果&#xff0c;展示&#xff08;视频效果展示&#xff09;&#xff1a; 奔跑的线条 from turtle import * import time t1Turtle() t2Turtle() t3Turtle() t1.hideturtle() t2.hideturtle() t3.hideturtle() t1.pencolor("red") t2.pencolor("green") t3…

从零搭建uniapp项目

目录 创建uni-app项目 基础架构 安装 uni-ui 组件库 安装sass依赖 easycom配置组件自动导入 配置view等标签高亮声明 配置uni-ui组件类型声明 解决 标签 错误 关于tsconfig.json中提示报错 关于非原生标签错误&#xff08;看运气&#xff09; 安装 uview-plus 组件库…