常见的设计表经验
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表中的字段中的张三属性
努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。