pdman 创建表同步数据库_Blog - models 模型层创建(数据库表)-4

模型层创建

django根据代码中定义的类来自动生成数据库表。我们写的类表示数据库的表,如果根据这个类创建的对象是数据库表里的一行数据,对象.id 对象.value是每一行里的数据。

基本的原则如下:

  • 每个模型在Django中的存在形式为一个Python
  • 每个模型都是django.db.models.Model的子类
  • 模型里的每个类代表数据库中的一个表
  • 模型的每个字段(属性)代表数据表的某一列
  • Django将自动为你生成数据库访问API

数据库表中设计models

通过之前数据库表设计可知 我们需要存储数据库表
  • 文章分类(分类表结构设计)

表名:Category、分类名:name

  • 文章(文章表结构设计)

表名:Article、标题:title、摘要:excerpt、分类:category、标签:tags、推荐位、内容:body、创建时间:created_time、作者:user、文章封面图片img

  • 文章标签(标签表设计)

表名:Tag、标签名:name

  • 幻灯图(幻灯图表结构设计)

表名:Banner、图片文本text_info、图片img、图片链接link_url、图片状态is_active。

  • 推荐位(推荐位表结构设计)

表名:Tui、推荐位名name。

  • 友情链接

表名:Link、链接名name、链接网址linkurl。

  • 表关系
    • 文章和分类是一对多的关系
    • 文章和标签是多对多的关系
    • 文章和作者是一对多的关系
    • 文章和推荐位是一对多关系(也可以设计成多对多)

编写models(blog/models.py)

from django.db import models
from django.contrib.auth.models import  User


# class UsersProfile(AbstractUser):
#     pass
# 

class Category(models.Model):
    """
    博客分类
    名字,排序
    """
    name = models.CharField('博客分类', max_length=100)
    index = models.IntegerField(default=999, verbose_name='分类排序')

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

    def __str__(self):
        return self.name


class Tag(models.Model):
    """
    文章标签
    """
    name = models.CharField('文章标签', max_length=100)

    class Meta:
        verbose_name = '文章标签'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Tui(models.Model):
    """
    推荐
    """
    name = models.CharField('推荐位', max_length=100)

    class Meta:
        verbose_name = '推荐位'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Article(models.Model):
    """
    文章主体
    """
    title = models.CharField('标题', max_length=70)
    excerpt = models.TextField('摘要', max_length=200, blank=True)
    category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name='分类', blank=True, null=True)
    # 使用外键分类表与文章是一对多关系
    tags = models.ManyToManyField(Tag, verbose_name='标签', blank=True)
    # 使用外键关联标签表与标签是多对多关系
    img = models.ImageField(upload_to='article_img/%Y/%m/%d/', verbose_name='文章图片', blank=True, null=True)
    body = models.TextField('内容')
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者')
    """
    文章作者,这里User是从django.contrib.auth.models导入的。
    这里我们通过 ForeignKey 把文章和 User 关联了起来。
    """
    views = models.PositiveIntegerField('阅读量', default=0)
    tui = models.ForeignKey(Tui, on_delete=models.DO_NOTHING, verbose_name='推荐位', blank=True, null=True)

    created_time = models.DateTimeField('发布时间', auto_now_add=True)
    modified_time = models.DateTimeField('修改时间', auto_now=True)

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = '文章'

    def __str__(self):
        return self.title


class Banner(models.Model):
    """
    Banner 轮播图
    """
    text_info = models.CharField('标题', max_length=50, default='')
    img = models.ImageField('轮播图', upload_to='banner/')
    link_url = models.URLField('图片链接', max_length=100)
    is_active = models.BooleanField('是否是active', default=False)

    def __str__(self):
        return self.text_info

    class Meta:
        verbose_name = '轮播图'
        verbose_name_plural = '轮播图'


class Link(models.Model):
    """
    友情链接
    """
    name = models.CharField('链接名称', max_length=20)
    linkurl = models.URLField('网址', max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '友情链接'
        verbose_name_plural = '友情链接'
  • 这里面我们多增加了一个img图片封面字段,用于上传文章封面图片的,article_img/为上传目录,%Y/%m/%d/为自动在上传的图片上加上文件上传的时间。
  • 数据迁移及创建
$ python manage.py makemigrations
Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Banner
    - Create model Category
    - Create model Link
    - Create model Tag
    - Create model Tui
    - Create model Article
(myblog) 

$ python manage.py migrate       
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK
  • 迁移中问题处理
$ python manage.py makemigrations 
SystemCheckError: System check identified some issues:

ERRORS:
blog.Article.img: (fields.E210) Cannot use ImageField because Pillow is not installed.
        HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".
blog.Banner.img: (fields.E210) Cannot use ImageField because Pillow is not installed.
        HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".
(myblog) 
# kame @ bogon in ~/my_storage/qianfeng/Project/myblog [12:20:02] C:1
$ pip install Pillow
  • 检查数据库

ca68157b77002399c84474eb339653fa.png

各位小伙伴如果觉得还可以,请关注、点赞、收藏。感谢各位!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值