博客系统| 表结构

项目流程:

1、搞清楚需求(产品经理)

(1)基于用户认证组件和Ajax实现登录验证(图片验证码)

(2)基于form组件和Ajax实现注册登录

(3)设计系统首页(文章列表渲染)

(4)设计个人站点页面

(5)文章详情页

(6)实现文章点赞功能

(7)实现文章评论;文章的评论、评论的评论

(8)富文本编辑框和放在xss攻击

扫描二维码关注公众号,回复: 1760261 查看本文章

2、设计表结构

3、按着每个功能进行开发

4、功能测试

5、项目部署上线

 表关系和表结构

from django.db import models

# Create your models here.

from  django.contrib.auth.models import User,AbstractUser  #User就是user_info这个也继承了AbstractUser
class UserInfo(AbstractUser):  #用户认证组件,要用用户表;扩展字段,继承AbstractUser类,
    '''用户信息'''
    nid = models.AutoField(primary_key=True)
    telephone = models.CharField(max_length=11, null=True, unique=True)
    avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png")
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)

    blog = models.OneToOneField(to='Blog', to_field='nid', null=True,on_delete=models.CASCADE)
    def __str__(self):
        return self.username
class Blog(models.Model):  #用户和站点表是一对一的关系
    '''博客信息表(站点表)'''
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='个人博客标题',max_length=64)
    site_name = models.CharField(verbose_name='站点名称',max_length=64)
    theme = models.CharField(verbose_name='博客主题',max_length=32)
    def __str__(self):
        return self.title

class Category(models.Model): #分类和用户是一对多的关系,分类和站点应该也是一对多,可以通过某一个去找另外一个
    '''博客个人文章分类表'''
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='分类标题', max_length=32)
    blog = models.ForeignKey(verbose_name='所属博客',to='Blog', to_field='nid',on_delete=models.CASCADE)
    def __str__(self):
        return self.title

class Tag(models.Model): #跟分类表是一样的;一个用户可以创建多个标签,一个标签也只能属于一个站点,一个站点可以有多个标签
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='标签名称',max_length=32)
    blog = models.ForeignKey(verbose_name='所属博客', to='Blog',to_field='nid',on_delete=models.CASCADE)
    def __str__(self):
        return self.title

class Article(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50, verbose_name='文章标题')
    desc = models.CharField(max_length=255, verbose_name='文章描述')
    create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
    content = models.TextField()

    comment_count = models.IntegerField(default=0)
    up_count = models.IntegerField(default=0)
    down_count = models.IntegerField(default=0)

    user = models.ForeignKey(verbose_name='作者',to='UserInfo',to_field='nid',on_delete=models.CASCADE) #文章和用户一对多
    category = models.ForeignKey(to='Category', to_field='nid', null=True,on_delete=models.CASCADE) #多对一   分类和文章多对多
    tags = models.ManyToManyField(  #用了一个中介模型,创建第三张表
        to="Tag",
        through='Article2Tag',
        through_fields=('article', 'tag'),
    )

    def __str__(self):
        return self.title
class Article2Tag(models.Model):  #文章和标签的多对多
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid',on_delete=models.CASCADE)
    tag = models.ForeignKey(verbose_name='标签', to='Tag',to_field='nid',on_delete=models.CASCADE)
    class Meta:
        unique_together = [
            ('article', 'tag'),
        ]
    def __str__(self):
        v = self.article.title + "---" + self.tag.title
        return v
class ArticleUpDown(models.Model):
    '''点赞表'''
    nid = models.AutoField(primary_key=True)
    user = models.ForeignKey('UserInfo',null=True,on_delete=models.CASCADE)
    article = models.ForeignKey("Article",null=True,on_delete=models.CASCADE)
    is_up = models.BooleanField(default=True)
    class Meta:
        unique_together = [
            ("article", 'user'),
        ]
class Comment(models.Model):
    '''评论表'''
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='评论文章', to='Article', to_field='nid',on_delete=models.CASCADE)
    user = models.ForeignKey(verbose_name='评论者',to='UserInfo', to_field='nid',on_delete=models.CASCADE)
    content = models.CharField(verbose_name='评论内容',max_length=255)
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)

    parent_comment = models.ForeignKey('self', null=True,on_delete=models.CASCADE) #自己关联自己
    def __str__(self):
        return self.content
'''
跟评论:对文章的评论;111  222    333
子评论:对评论的评论;444
                        555
Comment
nid user_id article_id  content parent_comment_id(null=True)
1       1       1           111     null
2       2       1           222     null
3       3       1           333     null
4       4       1           444     1
5       5       1           555     4
'''

settings里边

改成用mysql

DATABASES = {
    'default':{
        'ENGINE':'django.db.backends.mysql',
        'NAME':'cnblog',#要连接的数据库,连接前需创建好
        'USER':'root',#连接数据库的用户名
        'PASSWORD':'',#连接数据库的密码
        'HOST':'127.0.0.1',#连接本机,默认本机
        'PORT':'3306' #端口,默认3306
    }
}

把这个blog加上去。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]

应该先在mysql里边创建cnblog这个数据库再进行数据库迁移创建

mysql> create database cnblog;
Query OK, 1 row affected (0.22 sec)

进行数据库迁移

python manage.py makemigrations

python manage.py migrate
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

如果提示你这个就 pip install mysqlclient下

猜你喜欢

转载自www.cnblogs.com/shengyang17/p/9195624.html