Django开发博客系统(03-模型建立)

开始写Model层的代码,首先贴上之前的模型关系图

 Django开发博客系统(03-模型建立)

在Django中,每个App应该是一个自组织的应用(自组织:应用内部的所有逻辑都是相关联的,即紧耦合的).我们的Model处理应该按照易维护易扩展的原则来进行.

这里把Model划分为三类:blog相关,配置相关,评论相关.

 

在git上创建一个分支

git checkout -b add-blog-app-model

新建blogApp应用

python manage.py startapp blogApp

现在的项目结构

 Django开发博客系统(03-模型建立)

接下来编写blogApp中的models.py,首先创建博客内容相关的模型,User类使用django自带的User

blogApp

分类:

 1 from django.contrib.auth.models import User
 2 from django.db import models
 3 
 4 
 5 class Category(models.Model):
 6     STATUS_NORMAL = 1
 7     STATUS_DELETE = 0
 8     STATUS_ITEMS = (
 9         (STATUS_NORMAL, '正常'),
10         (STATUS_DELETE, '删除'),
11     )
12 
13     name = models.CharField(max_length=50, verbose_name='名称')
14     status = models.PositiveIntegerField(default=STATUS_NORMAL,
15                                          choices=STATUS_ITEMS, verbose_name='状态')
16     is_nav = models.BooleanField(default=False, verbose_name='是否为导航')
17     owner = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)  # 级联删除
18     created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
19 
20     class Meta:
21         verbose_name = verbose_name_plural = '分类'  # 在admin管理界面显示的名称

 

标签:

class Tag(models.Model):
    STATUS_NORMAL = 1
    STATUS_DELETE = 0
    STATUS_ITEMS = (
        (STATUS_NORMAL, '正常'),
        (STATUS_DELETE, '删除'),
    )

    name = models.CharField(max_length=10, verbose_name='名称')
    status = models.PositiveIntegerField(default=STATUS_NORMAL,
                                         choices=STATUS_ITEMS, verbose_name='状态')
    owner = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)  # 级联删除
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    class Meta:
        verbose_name = verbose_name_plural = '标签'  # 在admin管理界面显示的名称

 

文章:

 1 class Post(models.Model):
 2     STATUS_NORMAL = 1
 3     STATUS_DELETE = 0
 4     STATUS_DRAFT = 2
 5     STATUS_ITEMS = (
 6         (STATUS_NORMAL, '正常'),
 7         (STATUS_DELETE, '删除'),
 8         (STATUS_DRAFT, '草稿'),
 9     )
10 
11     title = models.CharField(max_length=255, verbose_name='标题')
12     desc = models.CharField(max_length=1024, blank=True, verbose_name='摘要')  # blank是针对表单的,null针对数据库
13     content = models.TextField(verbose_name='正文', help_text='正文必须为MarkDown格式')
14     status = models.PositiveIntegerField(default=STATUS_NORMAL,
15                                          choices=STATUS_ITEMS, verbose_name='状态')
16     category = models.ForeignKey(Category, verbose_name='分类', on_delete=models.CASCADE)  # 级联删除
17     tag = models.ManyToManyField(Tag, verbose_name='标签')
18     owner = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)
19     created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
20 
21     class Meta:
22         verbose_name = verbose_name_plural = '文章'
23         ordering = ['-id']  # 根据id降序排列

 

config App

python manage.py startapp config

现在项目的整体结构

 Django开发博客系统(03-模型建立)

config/models.py:

 

友链:

 1 from django.contrib.auth.models import User
 2 from django.db import models
 3 
 4 
 5 class Link(models.Model):
 6     STATUS_NORMAL = 1
 7     STATUS_DELETE = 0
 8     STATUS_ITEMS = (
 9         (STATUS_NORMAL, '正常'),
10         (STATUS_DELETE, '删除'),
11     )
12 
13     title = models.CharField(max_length=50, verbose_name='标题')
14     href = models.URLField(verbose_name='链接')  # 默认长度为200
15     status = models.PositiveIntegerField(default=STATUS_NORMAL,
16                                          choices=STATUS_ITEMS, verbose_name='状态')
17     is_nav = models.BooleanField(default=False, verbose_name='是否为导航')
18     owner = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)  # 级联删除
19     created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
20 
21     class Meta:
22         verbose_name = verbose_name_plural = '友链'  # 在admin管理界面显示的名称

 

侧边栏:

 

 1 class SideBar(models.Model):
 2     STATUS_SHOW = 1
 3     STATUS_HIDE = 0
 4     STATUS_ITEM = (
 5         (STATUS_SHOW, '展示'),
 6         (STATUS_HIDE, '隐藏'),
 7     )
 8     SIDE_TYPE = (
 9         (1, 'HTML'),
10         (2, '最新文章'),
11         (3, '最热文章'),
12         (4, '最近评论'),
13     )
14 
15     title = models.CharField(max_length=50, verbose_name='标题')
16     display_type = models.PositiveIntegerField(default=1,
17                                                choices=SIDE_TYPE, verbose_name='展示类型')
18     content = models.CharField(max_length=500, blank=True, verbose_name='内容',
19                                help_text='如果设置的不是HTML类型,可为空')
20     status = models.PositiveIntegerField(default=STATUS_SHOW,
21                                          choices=STATUS_ITEM, verbose_name='状态')
22     owner = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)
23     created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
24 
25     class Meta:
26         verbose_name = verbose_name_plural = '侧边栏'

 

评论App

python manage.py startapp comment

对于评论,我们可以把它耦合到文章上,创建一个一对多的关系.

我们也可以做的松耦合一点,把评论功能完全独立,只关心针对哪个页面来评论,这样做的好出是产品可以增加新的页面类型,比如友链页添加评论或者文章列表页添加评论,只关心URL,而不关心要评论的对象是什么..

 

此处暂时按照耦合的方式来做,即通过外键关联Post的方式.

comment/models.py:

from django.db import models

from blogApp.models import Post


class Comment(models.Model):
    STATUS_NORMAL = 1
    STATUS_DELETE = 0
    STATUS_ITEMS = (
        (STATUS_NORMAL, '正常'),
        (STATUS_DELETE, '删除'),
    )
    target = models.ForeignKey(Post, verbose_name='评论目标', on_delete=models.CASCADE)
    content = models.CharField(max_length=2000, verbose_name='内容')
    nickname = models.CharField(max_length=50, verbose_name='昵称')
    website = models.URLField(verbose_name='网站')
    email = models.EmailField(verbose_name='邮箱')
    status = models.PositiveIntegerField(default=STATUS_NORMAL,
                                         choices=STATUS_ITEMS, verbose_name='状态')
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    
    class Meta:
        verbose_name = verbose_name_plural = '评论'

 

到此为止,Model部分已经实现完毕了(敲得手酸)

 

在base.py中注册我们的应用

1 INSTALLED_APPS = [
2     'blogApp',
3     'config',
4     'comment',
5     ...后面省略
6 ]

对于列表中的顺序,Django会根据这些App的顺序来查找对应的资源.这意味着如果资源路径和名称相同的话,前面的会覆盖掉后面的.

 

创建数据库(表)

创建迁移文件,并执行迁移

python manage.py makemigrations python manage.py migrate

在pycharm中,可以通过database连接到我们的数据库中

 Django开发博客系统(03-模型建立)

 

 Django开发博客系统(03-模型建立)

找到我们项目目录下的db.sqlite3文件点击OK-->apply即可

 Django开发博客系统(03-模型建立)

可以看到django自动创建的表与我们创建的表.

 

最后把变更提交到github中

1 git add .
2 
3 git commit -m '完成App和Model代码的创建'
4 
5 git checkout master  # 切换到主分支
6 
7 git merge add-blog-app-model  # 把分支合并进来
8 
9 git push origin master  # 提交到github

今天就到这,书上还整理了django的Model中的各种字段与属性,明天我会结合网上的文档和其他人的见解总结一下.

 

Django开发博客系统(03-模型建立)

 

上一篇:python后端model模板


下一篇:【Python学习】 - TensorFlow.keras 不显示epochs进度条的方法