【Django5】模型定义与使用

news2025/1/12 4:10:19

系列文章目录

第一章 Django使用的基础知识
第二章 setting.py文件的配置
第三章 路由的定义与使用
第四章 视图的定义与使用
第五章 二进制文件下载响应
第六章 Http请求&HttpRequest请求类
第七章 会话管理(Cookies&Session)
第八章 文件上传实现
第九章 多种视图view
第十章 Django5模板引擎
第十一章 模型定义与使用
第十二章 ORM执行SQL语句和事务
第十三章 表单定义与使用
第十四章 内置Admin系统
第十五章 内置Auth认证系统


文章目录

  • 系列文章目录
  • 前言
  • 模型定义
  • 模型数据迁移
  • 模型查询
  • 模型分页查询
  • 高级查询匹配符
  • 模型多表查询
  • 模型数据新增
  • 模型数据修改
  • 模板删除数据
  • 总结


前言

Django5对各种数据库提供了很好的支持,包括PostgreSQL、MySQL、SQLite和 Oracle,而且为这些数据库提供了统一的API方法,这些API统称为ORM框架。通过使用Django5内置的ORM框架可以实现数据库连接和读写操作。


模型定义

ORM框架是一种程序技术,用于实现面向对象编程语言中不同类型系统的数据之间的转换。 从效果上说,它创建了一个可在编程语言中使用的“虚拟对象数据库”,通过对虚拟对象数据库的操作从而实现对目标数据库的操作,虚拟对象数据库与目标数据库是相互对应的。在 Django5中,虚拟对象数据库也称为模型,通过模型实现对目标数据库的读写操作,实现方法如下:

1.配置目标数据库,在settings.py中设置配置属性

2.构建虚拟对象数据库,在App 的models.py文件中以类的形式定义模型。

3.通过模型在目标数据库中创建相应的数据表。

4.在其他模块(如视图函数)里使用模型来实现目标数据库的读写操作。

settings.py下我们配置mysql数据库:
在这里插入图片描述

模型字段类型如下:

  • AutoField:自增长类型,数据表的字段类型为整数,长度为11位。

  • BigAutoField:自增长类型,数据表的字段类型为bigint,长度为20位。

  • CharField:字符类型。

  • BooleanField:布尔类型。

  • CommaSeparatedIntegerField:用逗号分割的整数类型。

  • DateField:日期( Date)类型。

  • DateTimeField:日期时间( Datetime)类型。Decimal:十进制小数类型。

  • EmailField:字符类型,存储邮箱格式的字符串。

  • FloatField:浮点数类型,数据表的字段类型变成Double类型。IntegerField:整数类型,数据表的字段类型为11位的整数。

  • BigIntegerField:长整数类型。

  • IPAddressField:字符类型,存储Ipv4地址的字符串。

  • GenericIPAddressField:字符类型,存储Ipv4和Ipv6地址的字符串。

  • NullBooleanField:允许为空的布尔类型。

  • PositiveIntegerFiel:正整数的整数类型。

  • PositiveSmallIntegerField:小正整数类型,取值范围为0~32767。

  • SlugField:字符类型,包含字母、数字、下画线和连字符的字符串。

  • SmallIntegerField:小整数类型,取值范围为-32,768~+32,767。

  • TextField:长文本类型。

  • TimeField:时间类型,显示时分秒HH:MM[ :ss[.uuuuuu]]。

  • URLField:字符类型,存储路由格式的字符串。

  • BinaryField:二进制数据类型。

  • FileField:字符类型,存储文件路径的字符串。

  • ImageField:字符类型,存储图片路径的字符串。

  • FilePathField:字符类型,从特定的文件目录选择某个文件。

模型字段参数如下:

  • verbose_name:默认为None,在 Admin站点管理设置字段的显示名称。

  • primary_key:默认为False,若为True,则将字段设置成主键。

  • max_length:默认为None,设置字段的最大长度。

  • unique:默认为False,若为True,则设置字段的唯一属性。

  • blank:默认为False,若为True,则字段允许为空值,数据库将存储空字符串。

  • null:默认为False,若为True,则字段允许为空值,数据库表现为NULL。

  • db_index:默认为False,若为True,则以此字段来创建数据库索引。default:默认为NOT_PROVIDED对象,设置字段的默认值。

  • editable:默认为True,允许字段可编辑,用于设置Admin的新增数据的字段。

  • serialize:默认为True,允许字段序列化,可将数据转化为JSON格式。

  • unique_for_date:默认为None,设置日期字段的唯一性。

  • unique_for_month:默认为None,设置日期字段月份的唯一性。

  • unique_for_year:默认为None,设置日期字段年份的唯一性。choices:默认为空列表,设置字段的可选值。

  • help_text:默认为空字符串,用于设置表单的提示信息。

  • db_column:默认为None,设置数据表的列名称,若不设置,则将字段名作为数据表的列名。

  • db_tablespace:默认为None,如果字段已创建索引,那么数据库的表空间名称将作为该字段的索引名。注意:部分数据库不支持表空间。

  • auto_created:默认为False,若为True,则自动创建字段,用于一对一的关系模型。validators:默认为空列表,设置字段内容的验证函数。

  • error_messages:默认为None,设置错误提示。

ForeignKey方法参数如下:

参数名参数说明
to指定关联的目标模型类。可以使用字符串表示模型类的路径,也可以直接使用模型类的引用。
on_delete指定当关联对象被删除时的行为。CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET0、DO_NOTHING。
related_name指定反向关联的名称,默认为模型类名_set。
to_field指定关联的目标模型类中用于关联的字段名称。默认为主键字段。
db_index如果为True,则在目标模型的关联字段上创建索引。
null指定关联字段是否可以为空。如果 null=True,则数据库中该字段将允许 NULL值。
blank指定关联字段是否可以为空。如果blank=True,则表单中该字段可以为空。
limit_choices_to指定关联对象的过滤条件。可以是一个字典、一个 QuerySet或一个函数。
verbose_name用于在 Django Admin后台中显示字段名称。
help_text用于在 Django Admin后台中显示帮助文本。

on_delete的models属性有下面设置选项:

  • CASCADE:这就是默认的选项,级联删除,你无需显性指定它。

  • PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。

  • SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。

  • SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。

  • SET(): 自定义一个值,该值当然只能是对应的实体了

根据上述信息,我们去模型models.py中建图书信息和图书种类各一张表,属于1对N关系。

from django.db import models

class BookTypeInfo(models.Model):
    id = models.AutoField(primary_key=True)
    bookTypeName = models.CharField(max_length=20)
    class Meta:
        db_table = "t_bookType"
        verbose_name = "图书类别"

class BookInfo(models.Model):
    id = models.AutoField(primary_key=True)
    bookName = models.CharField(max_length=20)
    price = models.FloatField()
    publishDate = models.DateField()
    bookType = models.ForeignKey(BookTypeInfo,on_delete=models.PROTECT)

    class Meta:
        db_table = "t_book"
        verbose_name = "图书信息"

模型数据迁移

然后我们执行:python manage.py makemigrations生成数据库迁移文件

所谓的迁移文件, 是类似模型类的迁移类,主要是描述了数据表结构的类文件;

这个生成的迁移文件在migrations目录下;每执行一次,都会生成一个新文件。
在这里插入图片描述
插入几条数据:

INSERT INTO `t_booktype` VALUES (1, '计算机类');
INSERT INTO `t_booktype` VALUES (2, '数学类');
INSERT INTO `t_book` VALUES (1, 'Python从入门到放弃', 98.8, '2004-03-16', 1);
INSERT INTO `t_book` VALUES (2, 'Java编程思想', 100, '2004-03-16', 1);
INSERT INTO `t_book` VALUES (3, 'Head First设计模式', 88, '2020-03-16', 1);
INSERT INTO `t_book` VALUES (4, '数学的秘密', 50, '2019-03-06', 2);

在这里插入图片描述

模型查询

我们知道数据库设有多种数据查询方式,如单表查询、多表查询、子查询和联合查询等,而 Django 的ORM框架对不同的查询方式定义了相应的API方法。下面我们通过实例来深入学习下;

我们来实现下图书信息的查询,顺便通过外键关联配置,把图书类别信息也级联查询出来。我们通过all()方法查询出所有图书信息;

views.py里我们加下bookList方法:

def bookList(request):
    title = '图书列表'
    bookList = BookInfo.objects.all()
    content_value = {'title': title, 'bookList': bookList}
    return render(request, 'bookList.html', context=content_value)

urls.py里加下映射配置:

path('book/list', helloWorld.views.bookList)

templates下新建book目录,book目录下新建list.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<table border="1">
    <tr>
        <th>序号</th>
        <th>书名</th>
        <th>价格</th>
        <th>出版日期</th>
        <th>分类</th>
    </tr>
    {% for book in bookList %}
        <tr>
            <td>{{ book.id }}</td>
            <td>{{ book.bookName }}</td>
            <td>{{ book.price }}</td>
            <td>{{ book.publishDate|date:"Y-m-d" }}</td>
            <td>{{ book.bookType.bookTypeName }}</td>

        </tr>
    {% endfor %}
</table>
</body>
</html>

测试运行,浏览器输入:http://127.0.0.1:8000/book/list
在这里插入图片描述

可以看到表中所有内容。接下来我们使用高级点的查表语法。

下面我们继续学习下ORM框架给我们提供的一些其他常用方法;

# 查询所有信息
bookList = BookInfo.objects.all()
# 获取数据集的第一条数据的bookName属性值
print(bookList[0].bookName) 
# 返回前2条数据 select * from t_book limit 2
bookList = BookInfo.objects.all()[:2]
# 查询指定字段
bookList = BookInfo.objects.values("bookName", "price")
# 查询指定字段 数据以列表方式返回,列表元素以元组表示
bookList = BookInfo.objects.values_list("bookName", "price")
ORM框架提供了get()方法,返回满足条件的单个数据:

# 获取单个对象,一般是根据id查询
book = BookInfo.objects.get(id=2)
print(book.bookName)

ORM框架提供了filter()方法,返回满足条件的数据:

# 返回满足条件id=2的数据,返回类型是列表
bookList = BookInfo.objects.filter(id=2)
bookList = BookInfo.objects.filter(price=100, id=1)
# filter的查询条件可以设置成字典格式
d = dict(price=100, id=1)
bookList = BookInfo.objects.filter(**d)
# SQL的or查询,需要引入Q,from django.db.models import Q
# 语法格式:Q(field=value)|Q(field=value) 多个Q之间用"|"隔开
bookList = BookInfo.objects.filter(Q(id=1) | Q(price=88))
# SQL的不等于查询,在Q查询中用“~”即可
# SQL select * from t_book where not (id=1)
bookList = BookInfo.objects.filter(~Q(id=1))

ORM框架提供了exclude()方法,返回不满足条件的数据:

# 也可以使用exclude 返回满足条件之外的数据 实现不等于查询
bookList = BookInfo.objects.exclude(id=1)
ORM框架提供了count()方法,返回满足查询条件后的数据量:

# 使用count()方法,返回满足查询条件后的数据量
t = BookInfo.objects.filter(id=2).count()
print(t)
ORM框架提供了distinct()方法,返回去重后的数据:

# distinct()方法,返回去重后的数据
bookList = BookInfo.objects.values('bookName').distinct()
print(bookList)
ORM框架提供了order_by()方法,对结果进行排序;默认是升序;如果需要降序,只需要在字段前面加“-”即可; 
# 使用order_by设置排序
# bookList = BookInfo.objects.order_by("price")
bookList = BookInfo.objects.order_by("-id")

ORM框架提供了annotate方法来实现聚合查询,比如数据值求和,求平均值等。

# annotate类似于SQL里面的GROUP BY方法
# 如果不设置values,默认对主键进行GROUIP BY分组
# SQL: select bookType_id,SUM(price) AS 'price_sum' from t_book GROUP BY bookType_id
r = BookInfo.objects.values('bookType').annotate(Sum('price'))
# SQL: select bookType_id,AVG(price) AS 'price_sum' from t_book GROUP BY bookType_id

模型分页查询

在Django中实现分页通常使用Paginator类。以下是一个简单的示例,展示了如何在Django视图中实现分页功能:

bookList = BookInfo.objects.all()
# Paginator(object_list ,per_page)
# object_list   结果集/列表
# per_page  每页多少条记录
p = Paginator(bookList, 2)
# 获取第几页的数据
bookListPage = p.page(2)
print("总记录数:", BookInfo.objects.count())

高级查询匹配符

由于是通过参数来传递字段限制条件,例如当我们要查询年龄大于12的学生,我们并不能直接这样使用

querystudent1 = Student.objects.filter(age>12)

Django通过字段后加__条件=值的方式来解决这样的问题,例如上面就可以这样进行查询

querystudent1 = Student.objects.filter(age__gt=12)
1.  等于 exact。
例:查询name等于‘xiao ming’的学生
Student.objects.filter(name='xiao ming')
Student.objects.filter(name__exact='xiao ming')#此处的exact可以省略

2.  模糊查询 like
    包含 contains
例:查询姓名包含'xiao'的学生。
Student.objects.filter(name__contains='xiao')
开头:startswith  结尾:endswith
例:查询姓名以'xiao'开头的学生 以'ming'结尾的学生
Student.objects.filter(name__startswith='xiao')
Student.objects.filter(name__endswith='ming')

3.  空查询   isnull
例:查询姓名不为空的学生
Student.objects.filter(name__isnull=False)

4.  范围查询  in 
例:查询年龄12或15或16的学生
Student.objects.filter(age__in=[12,15,16])

5.  比较查询 gt大于 lt(less than) gte(equal) lte
例:查询年龄大于等于12的学生
Student.objects.filter(age__gte=12)

6.  日期查询  date
例:查询1994年出生的学生。
Student.objects.filter(birthyear__date=1994)
例:查询1994年1月1日后出生的学生。
Student.objects.filter(birthyear__date__gt = date(1994,1,1))

7. 返回不满足条件的数据 exclude
例:查询id不为3的学生。
Student.objects.exclude(id=3)

模型多表查询

我们在日常的开发中,常常需要对多张数据表同时进行数据查询。多表查询需要在数据表之间建立表关系才能够实现。一对多或一对一的表关系是通过外键实现关联的,而多表查询分为正向查询和反向查询。

以模型BookInfo和BokkTypeInfo为例,如果查询主题是BookInfo,通过外键bookType_id去查询BooKTypeInfo的关联数据,那么该查询称为正向查询;如果查询对象的主题是模型BookTypeInfo,要查询它与模型BookInfo的关联数据,那么该查询称为反向查询;

下面是一个实例:

def bookList2(request):
    """
    多表查询  正常查询 和反向查询
    :param request:
    :return:
    """
    # 正向查询
    book: BookInfo = BookInfo.objects.filter(id=2).first()
    print(book.bookType.bookTypeName)

    # 反向查询
    bookType = BookTypeInfo.objects.filter(id=1).first()
    print(bookType.bookinfo_set.first().bookName)
    print(bookType.bookinfo_set.all())

    content_value = {"title": "图书列表"}
    return render(request, 'book/list.html')

模型数据新增

Django对数据库的数据进行增、删、改操作是借助内置ORM框架所提供的API方法实现的,简单来说,它在模型基础类 Model里定义数据操作方法,通过类继承将这些操作方法传给开发者自定义的模型对象,再由模型对象调用即可实现数据操作。

添加操作通过模型的save方法实现,添加下可以返回主键id值。

我们在前面实例的基础上,来实现这个例子。

因为添加页面是需要图书类别的数据,我们用下拉框实现。所以这里需要一个预处理操作。

先在views.py里定义一个添加预处理方法preAdd

def preAdd(request):
    """
    预处理,添加操作
    :param request:
    :return:
    """
    bookTypeList = BookTypeInfo.objects.all()
    print(bookTypeList)
    content_value = {"title": "图书添加", "bookTypeList": bookTypeList}
    return render(request, 'book/add.html', context=content_value)

urls.py里加下映射:

path('booklist/preadd', helloWorld.views.preAdd),

原先的list.html,加上添加的链接:

<a href="/book/preAdd">添加</a><br/>

再创建下图书添加页面add.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<form action="/booklist/add" method="post">
    {% csrf_token %}
    书名:<input type="text" name="bookName"><br>
    价格:<input type="text" name="price"><br>
    出版日期:<input type="date" name="publishDate"><br>
    分类:<select name="bookType_id">
    {% for bookType in bookTypeList %}
        <option value="{{ bookType.id }}">{{ bookType.bookTypeName }}</option>
    {% endfor %}
</select><br>
    <input  type="submit" value="提交">
</form>
</body>
</html>

最后在views.py里创建图书添加函数add:

def add(request):
    """
    图书添加
    :param request:
    :return:
    """
    # print(request.POST.get("bookName"))
    # print(request.POST.get("publishDate"))
    # print(request.POST.get("bookType_id"))
    # print(request.POST.get("price"))
    book = BookInfo()
    book.bookName = request.POST.get("bookName")
    book.publishDate = request.POST.get("publishDate")
    book.bookType_id = request.POST.get("bookType_id")
    book.price = request.POST.get("price")
    book.save()
    # 数据添加后,获取新增数据的主键id
    print(book.id)
    return bookList(request)

运行测试:浏览器输入:http://127.0.0.1:8000/booklist
在这里插入图片描述

在这里插入图片描述

模型数据修改

模型数据修改和添加都是用的save方法。

我们结合案例先实现下;

我们在views.py里先定义preUpdate方法,修改预处理,根据id获取图书信息,以及获取图书类别列表;

def preUpdate(request, id):
    """
    预处理,修改操作
    :param request:
    :return:
    """
    print("id:", id)
    book = BookInfo.objects.get(id=id)
    print(book)
    bookTypeList = BookTypeInfo.objects.all()
    print(bookTypeList)
    content_value = {"title": "图书修改", "bookTypeList": bookTypeList, "book": book}
    return render(request, 'book/edit.html', context=content_value)

运行运行
urls.py里加下映射:

path('book/preUpdate/<int:id>', helloWorld.views.preUpdate),

book/list.html修改下,加下修改操作链接:

                <a href="/book/preUpdate/{{ book.id }}">修改</a>

新建编辑页面edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
<h3>{{ title }}</h3>
<form action="/book/update" method="post">
    {% csrf_token %}
    <table>
        <tr>
            <td>图书名称:</td>
            <td>
                <input type="text" name="bookName" value="{{ book.bookName }}">
            </td>
        </tr>
        <tr>
            <td>出版日期:</td>
            <td>
                <input type="text" name="publishDate" value="{{ book.publishDate | date:'Y-m-d' }}">
            </td>
        </tr>
        <tr>
            <td>图书类别:</td>
            <td>
                <select name="bookType_id">
                    {% for bookType in bookTypeList %}
                        <option value="{{ bookType.id }}"
                                {% if book.bookType.id == bookType.id %}selected{% endif %}>
                            {{ bookType.bookTypeName }}
                        </option>
                    {% endfor %}
                </select>
            </td>
        </tr>
        <tr>
            <td>图书价格:</td>
            <td>
                <input type="text" name="price" value="{{ book.price }}">
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="hidden" name="id" value="{{ book.id }}">
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>
</form>
</body>
</html>

再写一个update方法,保存图书信息

def update(request):
    """
    图书修改
    :param request:
    :return:
    """
    book = BookInfo()
    book.id = request.POST.get("id")
    book.bookName = request.POST.get("bookName")
    book.publishDate = request.POST.get("publishDate")
    book.bookType_id = request.POST.get("bookType_id")
    book.price = request.POST.get("price")
    book.save()
    return bookList(request)

运行运行
urls.py里再加下映射:

path('book/update', helloWorld.views.update),

我们来测试下,浏览器输入:http://127.0.0.1:8000/booklist
在这里插入图片描述

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

模板删除数据

Django5 ORM框架提供了delete()方法来实现数据删除操作,下面是一些常用的方式,删除所有数据,删除指定id数据,根据filter条件删除删除。

删除所有数据

BookInfo.objects.all().delete()

删除指定id数据

BookInfo.objects.get(id=1).delete()

根据条件删除多条数据

BookInfo.objects.filter(price__gte=90).delete()

我们来完善下前面的实例:

views.py里先定义delete方法。

def delete(request, id):
    """
    图书删除
    :param request:
    :return:
    """
    # 删除所有数据
    # BookInfo.objects.all().delete()
    # 删除指定id数据
    BookInfo.objects.get(id=id).delete()
    # 根据条件删除多条数据
    # BookInfo.objects.filter(price__gte=90).delete()
    return bookList(request)

urls.py里加下映射:

path('book/delete/<int:id>', helloWorld.views.delete),

book/list.html里加下删除操作:

                <a href="/book/delete/{{ book.id }}">删除</a>

在这里插入图片描述
删除后数据就消失了,不信你自己试试

总结

本章主要认识了ORM框架 虚拟对象数据库,也学习了如何对虚拟对象数据库进行增删改查操作。继续加油吧。

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

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

相关文章

【ai】 2005年 rule based expert system学习笔记1

PPT 是2005年的? Negnevitsky, Pearson Education 使用两种推理引擎的选择 backward chaining(逆向链接)推理过程 backward chaining(逆向链接)推理过程的GPT解释 这幅图展示了一个基于规则的专家系统如何通过backward chaining(逆向链接)推理过程来达到最终的推理目标…

[tomato]靶机复现漏洞详解!

靶机地址&#xff1a; https://download.vulnhub.com/tomato/Tomato.ova 靶机环境&#xff1a;Vmware 网络&#xff1a;NAT模式 信息收集&#xff1a; arp-scan -l 扫描靶机ip地址 扫描开放的端口信息 nmap -sS -sV -p- 192.168.77.135 发现开放端口21&#xff…

Matplotlib柱形图大揭秘:让数据‘站’起来,比增高鞋垫还管用!

1. Matplotlib绘制柱形图/柱状图/条形图 柱状图是一种用矩形柱来表示数据分类的图表&#xff0c;柱状图可以垂直绘制&#xff0c;也可以水平绘制&#xff0c;它的高度与其表示的数据成正比关系 # 导包 import numpy as np import pandas as pd import matplotlib.pyplot as p…

黑马Java零基础视频教程精华部分_9_面向对象进阶(1)

系列文章目录 文章目录 系列文章目录一、static(表示静态) 是Java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量1、静态变量2、静态变量底层原理3、static静态方法4、工具类、测试类、Javabean类5、static注意事项从代码层面从内存层面 6、重新认识main方法…

[ WARN:0@0.014] global loadsave.cpp:248 cv::findDecoder imread_

[ WARN:00.014] global loadsave.cpp:248 cv::findDecoder imread_ 目录 [ WARN:00.014] global loadsave.cpp:248 cv::findDecoder imread_ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰…

网工必装软件,SecureCRT从零到精通,不可错过

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 中午好&#xff0c;我的网工朋友。 相信在平时的日常工作中&#xff0c;大家经常需要通过安全的方式远程访问各种设备和服务。SecureCRT作为一款强…

JavaWeb的三层架构和分层解耦

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 三层架构 分层解耦 三层架构是哪三层&#xff1f; Controller:表现层…

云微客短视频矩阵能带来流量吗?有哪些产品特色?

短视频平台&#xff0c;现如今已经成为了互联网最大的流量池&#xff0c;诸如抖音、快手、小红书、视频号、哔哩哔哩等平台&#xff0c;日活量都在上亿。短视频赛道汇聚了无数的用户群体&#xff0c;所以商企品牌的营销定位就应该在这里。 许多企业看到了这样的营销商机&#x…

AI绘画模型之:CLIP 与 DALL-E 2

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

自动驾驶:SLAM

什么是SLAM SLAM&#xff0c;即Simultaneous Localization and Mapping&#xff08;同时定位与地图构建&#xff09; 最早由Smith、Self和Cheeseman于1988年提出。是自动驾驶领域中的一项核心技术。它允许自动驾驶车辆在使用各种传感器&#xff08;如激光雷达、摄像头、IMU等&…

计算机毕业设计选题推荐-服装生产管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

大模型开闭源之争,本质是商业化的争夺

大模型从发展之初&#xff0c;即存在开源与闭源两条路线&#xff0c;孰优孰劣&#xff0c;也处于持续争论之中。2024年7月&#xff0c;在“2024世界人工智能大会”上&#xff0c;众多业内领军人物对大模型开闭源表达了针锋相对的观点。例如&#xff0c;百度创始人李彦宏站在闭源…

成功解决:java.security.InvalidKeyException: Illegal key size

在集成微信支付到Spring Boot项目时&#xff0c;可能会遇到启动报错 java.security.InvalidKeyException: Illegal key size 的问题。这是由于Java加密扩展&#xff08;JCE&#xff09;限制了密钥的长度。幸运的是&#xff0c;我们可以通过简单的替换文件来解决这个问题。 解决…

LeetCode 17.电话号码的字母组合 C++写法

LeetCode 17.电话号码的字母组合 C写法 思路&#x1f9d0;&#xff1a; 使用深度优先搜索递归进行解题。首先建立一个号码与字母的映射表&#xff0c;当接收传过来的号码字符串时减去字符0就可以拿到该号码。其次使用string存储当前号码所对应字母&#xff0c;然后for循环遍历字…

用Java手写jvm之尝试解析clazz文件内容

写在前面 源码 。 本文尝试来解析下class文件的内容&#xff0c;了解了class文件内容后&#xff0c;对我们提升java认知将会带来很大的帮助&#xff0c;有多大呢&#xff0c;不好说&#xff0c;总之很大很大&#xff0c;大到受不了&#x1f60d;&#x1f60d;&#x1f60d;。 …

安泰高压放大器在工业领域中的应用

高压放大器是一种在工业领域中发挥重要作用的电子设备&#xff0c;其功能是将低电压信号放大到更高的电压水平。这种设备在多个工业应用中都发挥着关键作用&#xff0c;提供了稳定、可调节的高电压输出。以下是高压放大器在工业领域中的主要应用&#xff1a; 1.精密仪器和实验室…

尚硅谷电商实时数仓笔记-《二》数仓建模概述

上一篇&#xff1a; 尚硅谷电商实时数仓笔记-《一》数仓概述-CSDN博客 二、数仓建模概述 2.1 数据仓库建模的意义 如果把数据看作图书馆里的书&#xff0c;我们希望看到它们在书架上分门别类地放置&#xff1b; 如果把数据看作城市的建筑&#xff0c;我们希望城市规划布局合理…

面试官没想到一个ArrayList,我都能跟他扯半小时

点赞再看&#xff0c;Java进阶一大半 南哥在stackoverflow社区看到14年前的这么一个问题&#xff1a;Java 的 Vector.add() 和 Vector.addElement() 有什么区别&#xff0c;大家有答案吗&#xff1f; 它们实际上没有区别&#xff01;&#xff01;&#xff01;1996年的JDK 1.0版…

每日一题,力扣leetcode Hot100之56. 合并区间

解题思路&#xff1a; 先按照每个数组的第一个数字sort排序。 每次进来一个数组&#xff0c;如果你的第1项大于别人的第2项&#xff0c;那么直接添加。 否则的话则存在可以合并的区间&#xff0c;然后合并的区间的第2项则为旧的和新的第2项的最大值。 class Solution:def m…

SpringBoot框架简单整合ShardingSphere-JDBC实现MySQL分库分表和读写分离及加密混合

1. 主从配置 1.1 主机1&#xff08;IP:192.168.186.77&#xff09; 1.1.1 docker-compose.yml version: 3.8services:mysql-master:image: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: masterMYSQL_PASSWORD: 123456MYSQL…