开始写Model层的代码,首先贴上之前的模型关系图
在Django中,每个App应该是一个自组织的应用(自组织:应用内部的所有逻辑都是相关联的,即紧耦合的).我们的Model处理应该按照易维护易扩展的原则来进行.
这里把Model划分为三类:blog相关,配置相关,评论相关.
在git上创建一个分支
git checkout -b add-blog-app-model
新建blogApp应用
python manage.py startapp blogApp
现在的项目结构
接下来编写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
现在项目的整体结构
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连接到我们的数据库中
找到我们项目目录下的db.sqlite3文件点击OK-->apply即可
可以看到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中的各种字段与属性,明天我会结合网上的文档和其他人的见解总结一下.