常见的设计表经验

Flask与Django的ORM不同的一点

Flask可以定义表的名称,在类中使用__tablename__='book_types' # 定义表名即可
而Django中数据表的命名时应用名_类名
Flask的话时db.string(40)函数括号中定义字段的大小,而django的是通过max_length来定义

在时间字段上Flask是使用db.DateTime而Django是models.DateTimeField(default=timezone.now)

django自带的admin后台影响的orm

Django中字段中就会有verbose_name

登陆场景

Django

重写admin模块
继承父类AdminSite并重写admin_view()和get_urls()方法

Flask

获取表单数据,然后验证,然后再跳转
具体的是先获取表单字段中的账号数据,账号通过之后再验证密码,再跳转到对应的界面

form=forms.LoginForm1() 
if form.validate_on_submit():# .validate_on_submit() ,也有可能是注销了validate_on_submit,所以没表单的数据
    # 获取表单类的数据直接用.data
    print('账号是:',form.name.data)
    reader=models.Reader.query.filter_by(id_r=form.name.data).first()
    if reader is None:
        flash('用户名不存在') # flash表单是什么
    elif reader.password == form.password.data:
        # print('session["user"]这个时候有么') # session['user']登录之后的固定用法,session来存储临时变量

        if reader.kind==2: # 只有kind为2的账户密码才可以返回管理员界面
            flash('你好,'+reader.name)
            return redirect('/manager')
        else:
            # print('session["user"]这个时候有么') # session['user']登录之后的固定用法,session来存储临时变量
            session['user']=reader.id_r
            flash('你好,'+reader.name)
            return redirect('/search')
    else:
        flash('密码错误')

return render_template('login.html',form=form)

用户表

Django用户表

扩展用户继承的字段
通过django.contrib.auth.models中的AbstractUser类实现

class MyUser(AbstractUser):
    name = models.CharField('姓名', max_length=50, default='匿名用户')
    introduce = models.TextField('简介', default='暂无介绍')
    company = models.CharField('公司', max_length=100, default='暂无信息')
    profession = models.CharField('职业', max_length=100, default='暂无信息')
    address = models.CharField('住址', max_length=100, default='暂无信息')
    telephone = models.CharField('电话', max_length=11, default='暂无信息')
    wx = models.CharField('微信', max_length=50, default='暂无信息')
    qq = models.CharField('QQ', max_length=50, default='暂无信息')
    wb = models.CharField('微博', max_length=100, default='暂无信息')
    photo = models.ImageField('头像', blank=True, upload_to='images/user/')

    # 设置返回值
    def __str__(self):
        return self.name

Flask用户表

通过flask_sqlalchemy中的SQLAlchemy类来作为数据库的orm
db = SQLAlchemy(app)
然后在继承db.model模块

class Reader(db.Model): # 读者信息
    __tablename__='reader'
    id_r = db.Column(db.String(40),primary_key=True,unique=True)
    name = db.Column(db.String(40))
    gender = db.Column(db.String(10))
    kind = db.Column(db.INTEGER)
    password=db.Column(db.String(40))
    phone=db.Column(db.String(40),default='110')
    grade=db.Column(db.String(40))
    department=db.Column(db.String(40))

文章表

Django文章表

Django中使用models.Model,并且model.TextField变为mdeditor.fields自带的MDTextField,可以渲染markdown格式。

from mdeditor.fields import MDTextField
class ArticleInfo(models.Model):
    # 文章与用户多对一 
    author = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='用户') # 使用多对一
    title = models.CharField('标题', max_length=200)
    content = MDTextField('内容')  # 更改之后记得数据迁移
    articlephoto = models.ImageField('文章图片', blank=True, upload_to='images/article/')
    reading = models.IntegerField('阅读量', default=0)
    liking = models.IntegerField('点赞量', default=0)
    created = models.DateTimeField('创建时间', default=timezone.now)
    updated = models.DateTimeField('更新时间', auto_now=True)
    article_tag = models.ManyToManyField(ArticleTag, blank=True, verbose_name='文章标签') # 使用多对多

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '博文管理'
        verbose_name_plural = '博文管理'

Flask书籍信息表

需要自己对id进行主键设置,唯一字段设置,而Django的话,也要设计这样的信息。

class Book(db.Model): # 书籍信息
    __tablename__ = 'book'
    id=db.Column(db.String(40),primary_key=True,unique=True)
    name = db.Column(db.String(40))
    style_num=db.Column(db.String(40))
    author=db.Column(db.String(20))
    count=db.Column(db.INTEGER,default=0)
    available_count = db.Column(db.INTEGER, default=0)
    price=db.Column(db.FLOAT,default=0)
    press=db.Column(db.String(40))
    publish_date=db.Column(db.String(40))
    summary=db.Column(db.String(80))
    def __repr__(self):
        return '<Book %r>' % (self.id)

标签页表

Django标签页

标签和关联的用户

class ArticleTag(models.Model):
    id = models.AutoField(primary_key=True)
    tag = models.CharField('标签', max_length=500)
    user = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='用户')

    def __str__(self):
        return self.tag

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

Flask图书类别

仅仅显示了主键和数量,名称

class Book_type(): # 图书类别
    __tablename__='book_types' # 定义表名
    id = db.Column(db.INTEGER,primary_key=True)
    num = db.Column(db.String(40),index=True,unique=True)
    name = db.Column(db.String(40))

    def __repr__(self):
        # %r格式化符:将任何Python对象转化成repr字符串,自动调用Python对象的__repr__()
        return '<book_type %r>'%(self.num)

评论表

Django评论表

评论外键关联所属文章

class Comment(models.Model):
    # 评论要外键关联所属文章,缘由是一个文章有多个评论
    article = models.ForeignKey(ArticleInfo, on_delete=models.CASCADE, verbose_name='所属文章')
    commentator = models.CharField('评论用户', max_length=90)
    commenta_email= models.CharField('评论邮箱', max_length=90)
    content = models.TextField('评论内容')
    created = models.DateTimeField('创建时间', auto_now_add=True)
    def __str__(self):
        return self.article.title

    class Meta:
        verbose_name = '评论管理'
        verbose_name_plural = '评论管理'

Flask评论表

class Comment(): 
    __tablename__='Comment' # 定义表名
    id = db.Column(db.INTEGER,primary_key=True)
    # ForeignKey字段传入的时表名.id,一般为主键
    article = db.Column(db.String(40),index=True,db.ForeignKey('reader.id_r'),index = True)
    commentator = db.Column(db.String(40))
    commenta_email = db.Column(db.String(40))
    content = db.Column(db.String(200))
    created =db.Column(db.DateTime) # 返回当前时间
    def __repr__(self):
        # %r格式化符:将任何Python对象转化成repr字符串,自动调用Python对象的__repr__()
        return '<book_type %r>'%(self.num)

什么时候采用关联

关联是指属性集的关联,比如,A表中有张三,B表中也有张三,此时关联指的是A,B表中的字段中的张三属性

posted @ 2022-04-30 19:23  索匣  阅读(33)  评论(0编辑  收藏  举报