青少年编程与数学 02-009 Django 5 Web 编程 05课题、数据库与ORM

青少年编程与数学 02-009 Django 5 Web 编程 05课题、数据库与ORM

  • 一、数据库
  • 二、ORM
  • 三、连接数据库
      • [在 Python 中连接 PostgreSQL](#在 Python 中连接 PostgreSQL)
        • [使用 `psycopg2` 库](#使用 psycopg2 库)
      • [在 Django 中连接 PostgreSQL](#在 Django 中连接 PostgreSQL)
      • [使用命令行工具连接 PostgreSQL](#使用命令行工具连接 PostgreSQL)
      • 注意事项
  • 四、练习
      • [步骤 1: 安装 Django 和 psycopg2](#步骤 1: 安装 Django 和 psycopg2)
      • [步骤 2: 创建 Django 项目](#步骤 2: 创建 Django 项目)
      • [步骤 3: 创建 Django 应用](#步骤 3: 创建 Django 应用)
      • [步骤 4: 配置 PostgreSQL 数据库](#步骤 4: 配置 PostgreSQL 数据库)
      • [步骤 5: 定义模型](#步骤 5: 定义模型)
      • [步骤 6: 迁移数据库](#步骤 6: 迁移数据库)
      • [步骤 7: 创建视图](#步骤 7: 创建视图)
      • [步骤 8: 创建表单](#步骤 8: 创建表单)
      • [步骤 9: 创建模板](#步骤 9: 创建模板)
      • [步骤 10: 配置 URL 路由](#步骤 10: 配置 URL 路由)
      • [步骤 11: 运行服务器](#步骤 11: 运行服务器)
      • [步骤 12: 测试项目](#步骤 12: 测试项目)
      • [步骤 13: 添加数据](#步骤 13: 添加数据)

课题摘要: 本文主要介绍了Django项目中数据库与ORM的相关内容。首先,列举了Django支持的多种数据库系统,如SQLite、PostgreSQL、MySQL等,并推荐PostgreSQL和SQLite作为常用选择。接着,详细讲解了Django ORM的核心功能,包括模型定义、查询集操作、CRUD操作以及关系映射等,强调了ORM在简化数据库操作、提高开发效率方面的作用。此外,还介绍了如何在Python和Django中连接PostgreSQL数据库,包括安装psycopg2库、配置数据库连接参数等步骤。最后,通过一个完整的Django项目示例,演示了如何连接并操作PostgreSQL数据库,创建一个简单的博客应用,涵盖了模型定义、数据库迁移、视图创建、表单处理、模板配置和URL路由设置等关键步骤。


一、数据库

Django 支持多种数据库系统,以下是常见的几种:

支持的数据库

  • SQLite:这是 Django 默认使用的数据库。它是一个轻量级、嵌入式的关系型数据库管理系统,不需要独立的服务器进程或配置,数据存储在一个单独的文件中。非常适合小型项目、原型开发和快速测试。
  • PostgreSQL:这是一个功能强大的开源关系型数据库,支持复杂的查询和事务处理,并且具有良好的性能和扩展性。它在数据密集型应用中表现出色,是 Django 社区中非常受欢迎的选择。
  • MySQL:这是一个流行的关系型数据库管理系统,具有良好的性能和稳定性。Django 提供了与 MySQL 的无缝集成。
  • Oracle:这是一个商业级的关系型数据库,广泛用于大型企业应用。
  • MariaDB:它是 MySQL 的一个分支,提供了更好的性能和一些额外的功能。

推荐使用的数据库

  • PostgreSQL:通常推荐使用 PostgreSQL,因为它功能强大、支持复杂查询、并且有良好的社区支持。它在事务管理和数据完整性保护方面表现出色。
  • SQLite:对于小型项目和快速原型开发,SQLite 是一个简单易用的选择。

选择合适的数据库取决于具体的应用需求、数据量、性能要求以及团队的熟悉度等因素。

二、ORM

Django 的 ORM(Object-Relational Mapping,对象关系映射)是 Django 框架的核心功能之一,它允许开发者使用 Python 代码来操作数据库,而不需要编写 SQL 语句。ORM 提供了一个抽象层,将数据库中的表映射为 Python 中的类,表中的记录映射为类的实例。以下是 Django ORM 的一些关键概念和功能:

模型(Models)

  • 定义模型 :模型是 Django 应用中的一个 Python 类,继承自 django.db.models.Model。每个模型对应数据库中的一个表。

  • 字段(Fields) :模型中的每个属性对应表中的一个字段。Django 提供了多种字段类型,如 CharFieldIntegerFieldDateTimeField 等。

    python 复制代码
    from django.db import models
    
    class Post(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        created_at = models.DateTimeField(auto_now_add=True)

查询集(QuerySets)

  • 查询集:是 Django ORM 中用于查询数据库记录的对象。它是一个可迭代的集合,表示数据库中的记录。

  • 创建查询集 :通过模型的 objects 管理器创建查询集。例如:

    python 复制代码
    posts = Post.objects.all()  # 获取所有记录
    recent_posts = Post.objects.filter(created_at__gte=datetime.date.today())  # 获取今天及以后创建的记录
  • 链式查询 :可以对查询集进行链式操作,如过滤、排序等。

    python 复制代码
    sorted_posts = Post.objects.filter(created_at__gte=datetime.date.today()).order_by('-created_at')

CRUD 操作

  • 创建(Create)

    python 复制代码
    new_post = Post(title='New Post', content='This is a new post.')
    new_post.save()
  • 读取(Read)

    python 复制代码
    post = Post.objects.get(pk=1)  # 获取主键为 1 的记录
  • 更新(Update)

    python 复制代码
    post.title = 'Updated Title'
    post.save()
  • 删除(Delete)

    python 复制代码
    post.delete()

关系映射

  • 一对多(ForeignKey)

    python 复制代码
    class Author(models.Model):
        name = models.CharField(max_length=100)
    
    class Post(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        author = models.ForeignKey(Author, on_delete=models.CASCADE)
  • 多对多(ManyToManyField)

    python 复制代码
    class Tag(models.Model):
        name = models.CharField(max_length=50)
    
    class Post(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        tags = models.ManyToManyField(Tag)
  • 一对一(OneToOneField)

    python 复制代码
    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        bio = models.TextField()

迁移(Migrations)

  • 生成迁移文件 :使用 makemigrations 命令生成迁移文件,记录模型的变更。

    bash 复制代码
    python manage.py makemigrations
  • 应用迁移 :使用 migrate 命令将迁移应用到数据库。

    bash 复制代码
    python manage.py migrate

Django 的 ORM 提供了一个强大且灵活的方式来处理数据库操作,使得开发者可以专注于业务逻辑的开发,而不需要编写复杂的 SQL 语句。

三、连接数据库

连接 PostgreSQL 数据库通常涉及几个步骤,包括安装必要的库、配置数据库连接参数以及使用适当的工具或代码来建立连接。以下是如何在不同环境中连接 PostgreSQL 数据库的详细步骤:

在 Python 中连接 PostgreSQL

使用 psycopg2

psycopg2 是 Python 中用于连接 PostgreSQL 的最常用的库。以下是使用 psycopg2 连接 PostgreSQL 的步骤:

  1. 安装 psycopg2

    bash 复制代码
    pip install psycopg2-binary
  2. 编写连接代码

    python 复制代码
    import psycopg2
    
    # 连接参数
    conn = psycopg2.connect(
        dbname="your_database_name",
        user="your_username",
        password="your_password",
        host="localhost",
        port="5432"
    )
    
    # 创建游标
    cur = conn.cursor()
    
    # 执行查询
    cur.execute("SELECT * FROM your_table_name")
    
    # 获取查询结果
    records = cur.fetchall()
    for record in records:
        print(record)
    
    # 关闭游标和连接
    cur.close()
    conn.close()

在 Django 中连接 PostgreSQL

如果你正在使用 Django,连接 PostgreSQL 的步骤如下:

  1. 安装 psycopg2

    bash 复制代码
    pip install psycopg2-binary
  2. 配置 settings.py

    在 Django 项目的 settings.py 文件中配置数据库设置:

    python 复制代码
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'your_database_name',
            'USER': 'your_username',
            'PASSWORD': 'your_password',
            'HOST': 'localhost',
            'PORT': '5432',
        }
    }
  3. 运行迁移

    运行 Django 的迁移命令以创建数据库表:

    bash 复制代码
    python manage.py makemigrations
    python manage.py migrate

使用命令行工具连接 PostgreSQL

如果你更喜欢使用命令行工具,可以使用 psql,这是 PostgreSQL 的命令行界面工具。

  1. 打开命令行

    在终端中输入以下命令:

    bash 复制代码
    psql -h localhost -U your_username -d your_database_name -p 5432
  2. 输入密码

    当提示输入密码时,输入你的数据库密码。

  3. 使用 psql

    一旦连接成功,你就可以在 psql 命令行中执行 SQL 命令了。

注意事项

  • 安全性:确保不要在代码中硬编码数据库密码,尤其是在生产环境中。可以使用环境变量或配置文件来管理敏感信息。
  • 防火墙和网络:如果你的 PostgreSQL 数据库不在本地运行,确保服务器的防火墙和网络配置允许你的客户端 IP 地址访问数据库端口(默认为 5432).
  • 权限:确保数据库用户有足够的权限来执行所需的数据库操作.

通过以上步骤,你可以在不同的环境中成功连接 PostgreSQL 数据库。

四、练习

下面是一个完整的 Django 项目示例,演示如何连接并操作 PostgreSQL 数据库。我们将创建一个简单的博客应用,允许用户查看和创建博客文章。

步骤 1: 安装 Django 和 psycopg2

首先,确保你已经安装了 Django 和 psycopg2。可以使用以下命令安装:

bash 复制代码
pip install django psycopg2-binary

步骤 2: 创建 Django 项目

创建一个新的 Django 项目:

bash 复制代码
django-admin startproject myblog
cd myblog

步骤 3: 创建 Django 应用

创建一个新的 Django 应用:

bash 复制代码
python manage.py startapp blog

步骤 4: 配置 PostgreSQL 数据库

编辑 myblog/settings.py 文件,配置 PostgreSQL 数据库:

python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'your_database_name',
        'USER': 'your_database_user',
        'PASSWORD': 'your_database_password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

步骤 5: 定义模型

blog/models.py 文件中定义博客文章的模型:

python 复制代码
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

步骤 6: 迁移数据库

运行以下命令以创建数据库表:

bash 复制代码
python manage.py makemigrations
python manage.py migrate

步骤 7: 创建视图

blog/views.py 文件中创建视图函数:

python 复制代码
from django.shortcuts import render, redirect
from .models import Post
from .forms import PostForm

def post_list(request):
    posts = Post.objects.all().order_by('-created_at')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_create(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm()
    return render(request, 'blog/post_create.html', {'form': form})

步骤 8: 创建表单

blog/forms.py 文件中创建表单:

python 复制代码
from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'content']

步骤 9: 创建模板

blog/templates/blog 目录下创建模板文件 post_list.htmlpost_create.html

  • post_list.html:

    html 复制代码
    <!DOCTYPE html>
    <html>
    <head>
        <title>Blog</title>
    </head>
    <body>
        <h1>Blog Posts</h1>
        <ul>
            {% for post in posts %}
            <li>
                <h2>{{ post.title }}</h2>
                <p>{{ post.content }}</p>
                <p>Created at: {{ post.created_at }}</p>
            </li>
            {% endfor %}
        </ul>
        <a href="{% url 'post_create' %}">Create Post</a>
    </body>
    </html>
  • post_create.html:

    html 复制代码
    <!DOCTYPE html>
    <html>
    <head>
        <title>Create Post</title>
    </head>
    <body>
        <h1>Create Post</h1>
        <form method="post">
            {% csrf_token %}
            {{ form.as_p }}
            <button type="submit">Create</button>
        </form>
    </body>
    </html>

步骤 10: 配置 URL 路由

blog/urls.py 文件中配置 URL 路由:

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('create/', views.post_create, name='post_create'),
]

myblog/urls.py 文件中包含应用的 URL 配置:

python 复制代码
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]

步骤 11: 运行服务器

启动 Django 开发服务器:

bash 复制代码
python manage.py runserver

步骤 12: 测试项目

打开浏览器,访问 http://127.0.0.1:8000/,你应该能看到博客文章列表。点击 "Create Post" 链接可以创建新的博客文章。

步骤 13: 添加数据

你也可以通过 Django admin 界面添加博客文章。首先,需要在 blog/admin.py 中注册模型:

python 复制代码
from django.contrib import admin
from .models import Post

admin.site.register(Post)

然后运行 python manage.py createsuperuser 创建一个管理员用户,登录 admin 界面(http://127.0.0.1:8000/admin/),添加一些博客文章.

通过以上步骤,你可以在 Django 中成功连接并操作 PostgreSQL 数据库,创建一个简单的博客应用。

相关推荐
愚戏师37 分钟前
Python:函数式编程
开发语言·python·算法
iku!!1 小时前
【Python+HTTP接口】POST请求不同请求头构造
python·http
DogDaoDao1 小时前
Conda 虚拟环境创建:加不加 Python 版本的深度剖析
开发语言·人工智能·pytorch·python·深度学习·conda
Leo来编程1 小时前
Python学习第十九天
python·学习
如果是君1 小时前
Ubuntu20.04安装运行DynaSLAM
linux·python·深度学习·神经网络·ubuntu
牛奔2 小时前
Linux 安装配置Anaconda
python·conda
往日情怀酿做酒 V17639296382 小时前
Django项目之订单管理part3
后端·python·django
查理零世2 小时前
【算法】 区间合并(附蓝桥杯真题) python
python·算法·蓝桥杯
人工智能研究所3 小时前
使用OpenCV与Python编写自己的俄罗斯方块小游戏
开发语言·python·opencv
DDD小小小宇宙3 小时前
python列表基础知识
开发语言·windows·python