我的网站搭建: (第一天) 模型设计

简介: 网站已经成功部署好多天了,今天突然发现以前在开发过程中遇到的问题没有被好好的记录下来,或者说是没有被保存。这样肯定是不可取的,这会让我陷入问题的轮回中,重复思考着如何解决一个问题,那就太花费时间和精力了。

网站已经成功部署好多天了,今天突然发现以前在开发过程中遇到的问题没有被好好的记录下来,或者说是没有被保存。这样肯定是不可取的,这会让我陷入问题的轮回中,重复思考着如何解决一个问题,那就太花费时间和精力了。所以,现在就尽可能地恢复一些记忆和还原当时做网站的经历,日后肯定会感谢今天的自己。

    首先一些基础知识如创建虚拟环境,创建项目已经在之前写过的Django入门里面详细介绍了,具体可以参照Django入门: (第一天) 开发环境,这里就直接进入主题—模型设计

    模型设计也就是对需求的满足,想要实现什么功能,模型就得怎么设计,因为我制作的是个人网站,所以我的设计应该是包含:

  1. 文章的标题
  2. 文章的正文
  3. 文章的发表时间
  4. 文章的修改时间
  5. 文章的摘要
  6. 文章的分类
  7. 文章的作者    

    为减少查询数据集的负担,需要将文章的分类文章的作者作为外键引用,其代码如下:

class Category(models.Model):
    """
        Django 要求模型必须继承 models.Model 类。
        Category 只需要一个简单的分类名 name 就可以了。
        CharField 指定了分类名 name 的数据类型,CharField 是字符型,
        CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
    """
    name = models.CharField(u'分类', max_length=20)

    class Meta:
        verbose_name = '分类'
        verbose_name_plural = '分类'

    def __str__(self):

        return self.name

    而Django自身提供了一个User类,可以直接引用这个外键,所以可不必另外建一个模型类

  models代码如下:

from django.db import models
from django.contrib.auth.models import User  # 引入USER


class Category(models.Model):
    """
        Django 要求模型必须继承 models.Model 类。
        Category 只需要一个简单的分类名 name 就可以了。
        CharField 指定了分类名 name 的数据类型,CharField 是字符型,
        CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
    """
    name = models.CharField(u'分类', max_length=20)

    class Meta:
        verbose_name = '分类'
        verbose_name_plural = '分类'

    def __str__(self):

        return self.name

class Post(models.Model):  
    """
        文章的数据库表稍微复杂一点,主要是涉及的字段更多。
    """

    # 文章标题
    # u'文章标题'可以在后台显示里面的字段名
    title = models.CharField(u'文章标题', max_length=70)

    # 文章正文,我们使用了 TextField。
    # 存储比较短的字符串可以使用 CharField,但对于文章的正文来说可能会是一大段文本,因此使用 TextField 来存储大段文本。
    body = TextField()

    # 这两个列分别表示文章的创建时间和最后一次修改时间,存储时间的字段用 DateTimeField 类型。
    # auto_now_add=True时间可以被确定为现在的时间,不需要在后台对该字段名进行操作
    created_time = models.DateTimeField(u'创建时间', auto_now_add=True)
    modified_time = models.DateTimeField(u'修改时间', auto_now_add=True)

    # 文章摘要,可以没有文章摘要,但默认情况下 CharField 要求必须存入数据,否则就会报错。
    # 指定 CharField 的 blank=True 参数值后就可以允许空值了。
    # excerpt = models.CharField(u'摘要', max_length=200, blank=True)
    # 这里我把摘要注释了,因为每次都要输入摘要很麻烦,后面可以直接模板中采用过滤器truncatechars可自由提取文章前规定字数

    # 这是分类,分类的模型已经定义在上面。
    # 这里把文章对应的数据库表和分类、标签对应的数据库表关联了起来,但是关联形式稍微有点不同。
    # 规定一篇文章只能对应一个分类,但是一个分类下可以有多篇文章,所以使用的是 ForeignKey,即一对多的关联关系。
    # 而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以使用 ManyToManyField,表明这是多对多的关联关系。
    # 文章可以没有标签,因此为标签 tags 指定了 blank=True。

    category = models.ForeignKey(Category)

    # 文章作者,这里 User 是从 django.contrib.auth.models 导入的。
    # django.contrib.auth 是 Django 内置的应用,专门用于处理网站用户的注册、登录等流程,User 是 Django已经写好的用户模型。
    # 通过 ForeignKey 把文章和 User 关联了起来。
    # 规定一篇文章只能有一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。
    # on_delete=models.CASCADE表示级联删除
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):

        return self.title

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = '文章'
        ordering = ['-modified_time']

    这个时候虽然已经把模型定下来了,但是注意要将该应用注册到seetings中,然后使用python manage.py createsuperuser创建一个超级用户,然后在admin.py加入以下代码,就可以在后台显示了

from django.contrib import admin
from .models import Category, Post 
# 自定义
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    """
        作用:自定义分类管理工具
        admin.ModelAdmin:继承admin.ModelAdmin类
    """
    # 在后台显示id值和分类名
    list_display = ('id', 'name')

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    """
        作用:自定义文章管理工具
        admin.ModelAdmin:继承admin.ModelAdmin类
    """
    # 在后台显示id值,博文名,创建时间,修改时间,目录,作者
    list_display = ('id', 'title', 'created_time', 'modified_time', 'category', 'author')    
    # 增加过滤框,且以文章分类作过滤器
    list_filter = ['category']
    # 增加文章标题搜索字段
    search_fields = ['title']
    # 后台管理每页显示20篇文章标题
    list_per_page = 20

 

相关文章
|
运维 负载均衡 算法
“分布式基础概念”全面解析,让你秒懂分布式系统!【一】
该博客文章全面解析了分布式系统的基础概念,包括微服务架构、集群与分布式的区别、节点定义、远程调用、负载均衡、服务注册与发现、配置中心、服务熔断与降级以及API网关,帮助读者快速理解分布式系统的关键组成部分和工作原理。
“分布式基础概念”全面解析,让你秒懂分布式系统!【一】
|
运维 监控 安全
深入了解WGCLOUD - 开源运维监测平台
WGCLOUD是一款轻量高效的运维监测系统**,开源免费,性能高效,稳定安全,开箱即用,部署实施操作简单,它可以让任何角色快速上手使用,比如我们的开发工程师,产品工程师,项目经理,运维工程师,数据库工程师等
深入了解WGCLOUD - 开源运维监测平台
|
编解码 人工智能 搜索推荐
如何在短视频中合成“虚拟数字人”?
高效、便捷的数字人视频制作体验
643 0
|
数据可视化 定位技术 Python
可视化 | 分享一套Flask+Pyecharts可视化模板
可视化 | 分享一套Flask+Pyecharts可视化模板
|
弹性计算 分布式计算 关系型数据库
轻松上云系列之一:本地数据迁移上云
本文档围绕如何将您的本地数据迁移到阿里云,提供了多个场景的迁移实践方案。12月27日新增:物理机平台、VMWare、Xen/KVM/Hyper-V迁移至阿里云ECS
8506 0
|
4天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1106 0
|
3天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
508 10
|
13天前
|
人工智能 运维 安全
|
12天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
4天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
301 0