Django项目创建数据模型(Model)

  Django是通过Model来操作数据库的,无论我们使用的是mysql还是sqlite3,Django都会帮我们自动生成相应数据库类型的sql语句,所以我们不需要关注sql语句和类型,Django会帮我们自动生成,我们只需要会写model就可以了。

  Django根据代码中编写的类来自动生成数据库表。我们写的类表示数据库的表。

  基本原则:

  • 每个模型在Django中表现为一个Python类
  • 每个模型都是继承自django.db.models.Model,都是django.db.models.Model的子类
  • 模型里的每个类都代表着数据库中的一个表
  • 模型的每个字段(属性)都代表着数据库表中的某一列
  • Django会自动生成访问数据库的API

 

下面我们以博客项目为例,经过分析,完成博客项目我们需要存储六种数据:文章分类、文章、文章标签、幻灯图、推荐位、友情链接。每种数据一个表。

from django.db import models
from django.contrib.auth.models import User 
#导入Django自带用户模块

# 文章分类
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

#Banner
class Banner(models.Model):
    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 = '友情链接'

其中,文章与分类是一对多的关系,文章与标签是多对多的关系,文章与作者是一对多的关系,文章与推荐位是一对多的关系;

上面Article类中的img表示图片封面字段,article_img/为上传目录,%Y/%m/%d/为自动在上传的图片上加上文件上传的时间。

完成上面的model编写之后,我们仅仅是完成了model的代码编写,但是这些模型并没有真正的在数据库中创建表,我们接下来就需要进行数据库迁移!

  在进行数据库迁移之前我们需要先配置Django项目使用MySQL数据库(如果使用默认的数据库那就不用配置了),mysql配置请参考:Django项目如何使用mysql数据库  

在数据库配置好之后,我们就可以来进行数据库迁移啦!数据库迁移非常的简单,只需要执行以下命令即可:

python3 manage.py makemigrations
python3 manage.py migrate

迁移的时候可能会提示需要安装Pillow,出现这个错误的原因是因为我们的Article和Banner类使用了图片字段ImageField,我们需要用到图片处理包,按照错误提示执行安装Pillow模块就可以了:

pip3 install Pillow

Pillow模块安装成功之后,再执行迁移数据库:

数据库迁移成功之后,程序会在blog下的migrations目录里自动生成几个000开头的文件,文件里面记录着数据库迁移记录: 

 数据库迁移后查看数据库中表,表名默认为:应用名称_模型名称:

 至此,我们的模型model就创建成功了!

posted @ 2020-02-17 23:45  lwjnicole  阅读(3040)  评论(0编辑  收藏  举报