搭建一个简单的Django项目 利用ORM对象操作数据库

什么是Django

Django 是 Python 全栈式 Web 框架,以快速开发完整 Web 应用为目标,同时提供后端核心能力与前端渲染支撑。

1. 后端核心能力(核心职责)

  1. 处理业务逻辑:接收请求、校验数据、控制权限
  2. 数据管理:内置 ORM,免手写 SQL,完成数据库增删改查
  3. 提供接口:返回 HTML 页面 或 RESTful API
  4. 安全与通信:内置防攻击机制、认证会话,封装 HTTP 请求 / 响应

2. 对前端的支撑(非前端框架但提供配套)

  1. 模板渲染:DTL 模板引擎动态生成 HTML 页面
  2. 静态资源:统一管理 CSS/JS/ 图片,支持缓存与版本控制
  3. 表单能力:后端定义规则,自动生成表单并完成验证
  4. 自动后台:Admin 管理页面,一键实现数据管理

搭建项目

1. 虚拟环境

 # Windows
 python -m venv venv
 ​
 # macOS/Linux
 python3 -m venv venv

2. 激活虚拟环境

 # Windows
 venv\Scripts\activate
 ​
 # macOS/Linux
 source venv/bin/activate

3. 安装 Django

 pip install django

4. 创建项目

方式一:命令行创建

 django-admin startproject 项目名

方式二:PyCharm 创建

在 PyCharm 中新建项目时选择 Django 模板


配置文件

1. setting

要使用ORM类映射数据库,执行对应数据库操作,需先执行以下操作

  1. app注册
  2. 数据库选项
    # Application definition
    
    INSTALLED_APPS = [
        "django.contrib.admin",
        "django.contrib.auth",
        "django.contrib.contenttypes",
        "django.contrib.sessions",
        "django.contrib.messages",
        "django.contrib.staticfiles",
        "book",  # 自定义应用 映射时需添加
        "movie",
    ]
    
    # 数据库信息 以mysql为例 先建立名为db_douban的数据库
    
    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.mysql",
            "NAME": "db_douban",
            "USER": "root",
            "PASSWORD": "你的密码",
            "HOST": "127.0.0.1",
            "PORT": "3306",
        }
    }

2. urls与views

Django 中 URL 路径通过路由映射绑定视图(views)函数,实现请求地址与业务逻辑的对应;

若主 urls.py 中路径过多,可在每个 app 下新建 urls.py 文件;

主路由通过 include () 将对应路径分发到各 app 的 urls 文件,实现路由拆分与解耦。

1.路由映射视图函数

2.路由拆分

主路由( DjangoProject\DjangoProject\urls.py)

urlpatterns = [
    # 管理界面
    path("admin/", admin.site.urls),
    # 路由分发策略,将以book/开头的 URL 请求,转发到book应用下的urls.py文件中处理;
    path("book/", include("book.urls", namespace="book")),  # 映射子路由 命名空间
    # 电影
    path("movie/", include("movie.urls", namespace="movie")),
    #
    # 当 URL 规则较多时,通过这种 “主路由分发 + 应用独立路由” 的方式拆分,
    # 可降低主路由复杂度,让 URL 管理更清晰
]

子路由( DjangoProject\book\urls.py)

from django.urls import path
from book import views

# 指定命名空间, 路由前缀
app_name = "book"

# 子路由规则列表
# 映射 “URL 路径” 到 “视图函数 / 类”。
urlpatterns = [
    # 书籍列表
    path("list", views.book_list, name="book_list"),
    # 书籍详情
    path("details/<book_id>/", views.book_detail, name="book_detail"),
    # 添加分类
    path(
        "addcategory/", views.add_category, name="add_category"
    ),  # 注意添加/ apifox对/ 敏感
    # 添加书籍
    path("addbook/", views.add_book, name="add_book"),
]

3. models 与 数据库映射(迁移)

类与表

  1. 在 ORM 框架中,models 里定义的类(ORM 对象)对应数据库中的一张表
  2. 该类的一个实例(对象)对应表中的一行数据
  3. 实例的一个属性对应该行数据中的一个字段
class Book(models.Model):
    """
    书籍模型类 继承自 models.Model
    映射到数据库中,表名默认 应用名_类名

    title:书名
    author:作者
    price:价格
    pub_date:出版日期
    """

    title = models.CharField(max_length=100, verbose_name="书名")
    author = models.CharField(max_length=100, verbose_name="作者")
    price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name="价格")
    pub_date = models.DateField(auto_now_add=True, verbose_name="出版日期")
    # 外键关联
    category = models.ForeignKey(
        "Category", on_delete=models.CASCADE, verbose_name="分类"
    )

    # 模型元数据
    class Meta:
        db_table = "book"
        verbose_name = "图书"
        verbose_name_plural = verbose_name  # 单复数一致
        managed = False  # 已有数据库表 不用管理当前模型类


# 分类模型类
class Category(models.Model):
    name = models.CharField(max_length=100, verbose_name="分类名称")
    description = models.TextField(verbose_name="描述")

外键

  1. 模型设计:category(一)和 book(多)是一对多关系,外键字段需定义在 book 表中,关联 category 的主键。
  2. 视图处理:接收前端传递的外键值(如 category_id)后,需先从 category 表查询出对应的 Category 实例,再将该实例赋值给 Book 对象的外键字段,而非直接赋值外键数值。
  3. 核心原因:Django ORM 中,外键字段存储的是关联模型的实例,而非单纯的数值,直接赋值数值会导致关联失效或报错。
# 视图处理
@csrf_exempt
def add_book(request):
    """
    添加书籍
    :param request:
    :return:
    """
    title = request.POST.get("title")
    author = request.POST.get("author")
    price = request.POST.get("price")
    pub_date = request.POST.get("pub_date")
    category = request.POST.get("category")

    """
    Django外键赋值规则:外键字段需传入关联模型的实例,而非直接传 ID;
    步骤为「取前端 ID→查模型实例→赋值给外键字段」;
    需注意get方法的异常处理,避免因无效 ID 导致程序崩溃。
    """
    category_obj = Category.objects.get(id=category)

    # 传入参数 映射类的实例
    book = Book(
        title=title,
        author=author,
        price=price,
        pub_date=pub_date,
        category=category_obj,
    )
    book.save()

    text = f"书籍:<{title}> 添加成功"
    return HttpResponse(text)

相关命令

迁移命令:
检测model的变更,生成迁移配置文件: 
python manage.py makemigrations  
读取迁移配置文件,将模型变更同步到数据库: 
python manage.py migrate

回滚: 
#如果还没migrate,可以重新生成
rm -rf blog/migrations/  
python manage.py makemigrations book 具体版本
#如果已经migrate,需要先回滚再重新生成
python manage.py migrate book zero
python manage.py makemigrations blog
python manage.py migrate book 0001_initial

演示

启动项目

apifox发送post请求

向数据库添加数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值