django搭建项目配置环境和创建表过程详解


Posted in Python onJuly 22, 2019

1. 搭建项目配置环境和创建表

创建一个ttsx的项目

django-admin startproject ttsx

django搭建项目配置环境和创建表过程详解

在ttsx下的__init__中导入mysql

import pymysql
pymysql.install_as_MySQLdb()

配置mysql 读写分离配置

# default:默认的配置的是主数据库
 'default': {
  'ENGINE': 'django.db.backends.mysql',
  'HOST': 'localhost',
  'PORT': 3306,
  'USER': 'root',
  'PASSWORD': "mysql",
  'NAME': "ttsx"
 },
 # 配置的是从数据库
 'slave': {
  'ENGINE': 'django.db.backends.mysql',
  'HOST': 'localhost',
  'PORT': 3306,
  'USER': 'root',
  'PASSWORD': "mysql",
  'NAME': "ttsx"
 },

在项目的目录下新建utils/db_router.py文件如下图:

django搭建项目配置环境和创建表过程详解

在 utils/db_router.py中定义一个数据库路由,实现一个策略来控制特定模型的访问性

数据库路由¶

数据库路由是一个类,它提供4个方法:

db_for_read(model, **hints)¶

建议model类型的对象的读操作应该使用的数据库。

如果一个数据库操作能够提供其它额外的信息可以帮助选择一个数据库,它将在hints字典中提供。合法的hints 的详细信息在下文给出。

如果没有建议,则返回None。

db_for_write(model, **hints)¶

建议Model 类型的对象的写操作应该使用的数据库。

如果一个数据库操作能够提供其它额外的信息可以帮助选择一个数据库,它将在hints字典中提供。 合法的hints 的详细信息在下文给出。

如果没有建议,则返回None。

allow_relation(obj1, obj2, **hints)¶

如果obj1 和obj2 之间应该允许关联则返回True,如果应该防止关联则返回False,如果路由无法判断则返回None。这是纯粹的

验证操作,外键和多对多操作使用它来决定两个对象之间是否应该允许一个关联。

class MasterSlaveDBRouter(object):
 """读写分离路由"""
 
 def db_for_read(self, model, **hints):
  """读数据库"""
  return "slave"
 
 def db_for_write(self, model, **hints):
  """写数据库"""
  return "default"
 
 def allow_relation(self, obj1, obj2, **hints):
  """是否运行关联操作"""
  return True

在配置中声明读写分离路由所在的真正路径:

DATABASE_ROUTERS = ["utils.db_router.MasterSlaveDBRouter"]

=========================================================================================================================================================

为类补充字段

在utils目录中创建一个models.py用来'''为模型类补充字段'''的抽象类, 声明一个类是抽象类,不迁移,专门给别的表继承用的

在元选项中增添属性 abstract=True

from django.db import models

class BaseModel(models.Model):
 '''为模型类补充字段'''
 create_time=models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
 update_time=models.DateTimeField(auto_now=True,verbose_name='更新时间')
 class Meta:
  abstract=True # 声明是抽象模型类,不迁移,专门给别的表继承用的

==========================================================================================================================================================

创建应用

在项目队根目录下创建一个app目录用来存储所有的应用:

django搭建项目配置环境和创建表过程详解

分别创建 应用 cart goods orders users

python ../manage.py startapp cart
 
python ../manage.py startapp goods
 
python ../manage.py startapp orders
 
python ../manage.py startapp users

在goods应用中的models中定义如下和商品相关的类:

from django.db import models
from utils.models import BaseModel
from tinymce.models import HTMLField
 
# Create your models here.
 
 
class GoodsCategory(BaseModel):
 """商品类别表"""
 name = models.CharField(max_length=20, verbose_name="名称")
 logo = models.CharField(max_length=100, verbose_name="标识")
 image = models.ImageField(upload_to="category", verbose_name="图片")
 
 class Meta:
  db_table = "df_goods_category"
  verbose_name = "商品类别" # admin站点使用
  verbose_name_plural = verbose_name
 
 def __str__(self):
  return self.name
 
 
class Goods(BaseModel):
 """商品SPU表"""
 name = models.CharField(max_length=100, verbose_name="名称")
 # desc = HTMLField(verbose_name="详细介绍", default="", blank=True) 富文本编辑器
 
 class Meta:
  db_table = "df_goods"
  verbose_name = "商品"
  verbose_name_plural = verbose_name
 
 def __str__(self):
  return self.name
 
 
class GoodsSKU(BaseModel):
 """商品SKU表"""
 category = models.ForeignKey(GoodsCategory, verbose_name="类别")
 goods = models.ForeignKey(Goods, verbose_name="商品")
 name = models.CharField(max_length=100, verbose_name="名称")
 title = models.CharField(max_length=200, verbose_name="简介")
 unit = models.CharField(max_length=10, verbose_name="销售单位")
 price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="价格")
 stock = models.IntegerField(default=0, verbose_name="库存")
 sales = models.IntegerField(default=0, verbose_name="销量")
 default_image = models.ImageField(upload_to="goods", verbose_name="图片")
 status = models.BooleanField(default=True, verbose_name="是否上线")
 
 class Meta:
  db_table = "df_goods_sku"
  verbose_name = "商品SKU"
  verbose_name_plural = verbose_name
 
 def __str__(self):
  return self.name
 
 
class GoodsImage(BaseModel):
 """商品图片"""
 sku = models.ForeignKey(GoodsSKU, verbose_name="商品SKU")
 image = models.ImageField(upload_to="goods", verbose_name="图片")
 
 class Meta:
  db_table = "df_goods_image"
  verbose_name = "商品图片"
  verbose_name_plural = verbose_name
 
 def __str__(self):
  return str(self.sku)
 
 
class IndexGoodsBanner(BaseModel):
 """主页轮播商品展示"""
 sku = models.ForeignKey(GoodsSKU, verbose_name="商品SKU")
 image = models.ImageField(upload_to="banner", verbose_name="图片")
 index = models.SmallIntegerField(default=0, verbose_name="顺序")
 
 class Meta:
  db_table = "df_index_goods"
  verbose_name = "主页轮播商品"
  verbose_name_plural = verbose_name
 
 def __str__(self):
  return str(self.sku)
 
 
class IndexCategoryGoodsBanner(BaseModel):
 """主页分类商品展示"""
 DISPLAY_TYPE_CHOICES = (
  (0, "标题"),
  (1, "图片")
 )
 category = models.ForeignKey(GoodsCategory, verbose_name="商品类别")
 sku = models.ForeignKey(GoodsSKU, verbose_name="商品SKU")
 display_type = models.SmallIntegerField(choices=DISPLAY_TYPE_CHOICES, verbose_name="展示类型")
 index = models.SmallIntegerField(default=0, verbose_name="顺序")
 
 class Meta:
  db_table = "df_index_category_goods"
  verbose_name = "主页分类展示商品"
  verbose_name_plural = verbose_name
 
 def __str__(self):
  return str(self.sku)
 
 
class IndexPromotionBanner(BaseModel):
 """主页促销活动展示"""
 name = models.CharField(max_length=50, verbose_name="活动名称")
 url = models.URLField(verbose_name="活动连接")
 image = models.ImageField(upload_to="banner", verbose_name="图片")
 index = models.SmallIntegerField(default=0, verbose_name="顺序")
 
 class Meta:
  db_table = "df_index_promotion"
  verbose_name = "主页促销活动"
  verbose_name_plural = verbose_name
 
 def __str__(self):
  return self.name

在orders应用中的models中定义如下和订单相关的类:

from django.db import models
from utils.models import BaseModel
from users.models import User, Address
from goods.models import GoodsSKU
 
# Create your models here.
 
 
class OrderInfo(BaseModel):
 """订单信息"""
 PAY_METHOD_CHOICES = (
  (1, "货到付款"),
  (2, "支付宝"),
 )
 
 ORDER_STATUS_CHOICES = (
  (1, "待支付"),
  (2, "待发货"),
  (3, "待收货"),
  (4, "待评价"),
  (5, "已完成"),
 )
 
 order_id = models.CharField(max_length=64, primary_key=True, verbose_name="订单号")
 user = models.ForeignKey(User, verbose_name="下单用户")
 address = models.ForeignKey(Address, verbose_name="收获地址")
 total_count = models.IntegerField(default=1, verbose_name="商品总数")
 total_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品总金额")
 trans_cost = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="运费")
 pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=1, verbose_name="支付方式")
 status = models.SmallIntegerField(choices=ORDER_STATUS_CHOICES, default=1, verbose_name="订单状态")
 trade_id = models.CharField(max_length=100, unique=True, null=True, blank=True, verbose_name="支付编号")
 
 class Meta:
  db_table = "df_order_info"
 
 
class OrderGoods(BaseModel):
 """订单商品"""
 order = models.ForeignKey(OrderInfo, verbose_name="订单")
 sku = models.ForeignKey(GoodsSKU, verbose_name="订单商品")
 count = models.IntegerField(default=1, verbose_name="数量")
 price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="单价")
 comment = models.TextField(default="", verbose_name="评价信息")
 
 class Meta:
  db_table = "df_order_goods"

在users应用中的models中定义如下和用户相关的类:

from django.db import models
from django.contrib.auth.models import AbstractUser
from utils.models import BaseModel
from django.conf import settings
from goods.models import GoodsSKU
 
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
 
# Create your models here.
 
# django默认的认证机制,在setting installAPPs中的 'django.contrib.auth',
# 所以我们要声明自己的认证路径 去setting配置,AUTH_USER_MODEL = "users.User"
 
class User(AbstractUser, BaseModel):
 """用户"""
 # 我们自己不用指明字段,django的默认字段,都通过继承AbstractUser它就有了
 class Meta:
  db_table = "df_users"
 
 def generate_active_token(self):
  """生成激活令牌"""
  serializer = Serializer(settings.SECRET_KEY, 3600)
  token = serializer.dumps({"confirm": self.id}) # 返回bytes类型
  return token.decode()
 
 
class Address(BaseModel):
 """地址"""
 user = models.ForeignKey(User, verbose_name="所属用户")
 receiver_name = models.CharField(max_length=20, verbose_name="收件人")
 receiver_mobile = models.CharField(max_length=11, verbose_name="联系电话")
 detail_addr = models.CharField(max_length=256, verbose_name="详细地址")
 zip_code = models.CharField(max_length=6, verbose_name="邮政编码")
 
 class Meta:
  db_table = "df_address"

============================================================================================================================================================================== 

用户认证模型类

在配置文件中,指定自己定义的认证系统使用的用户模型路径在user应用中的User类,django只支持模块和类名之间用.分隔,多了一个点就解析不出来,

如这样就解析不出来,AUTH_USER_MODEL = "apps.users.User" Django,所以要把它变成,users.User,所以将apps目录添加到解析路径里

import sys
sys.path.insert(1, os.path.join(BASE_DIR, "app"))
 
#认证系统使用的用户模型
AUTH_USER_MODEL = "users.User"

把注册的应用 添加到配置文件的INSTALLED_APPS中,因为上面在 自定义用户认证模型类的时候,已经把app目录添加到解析路径里了,所以不用app.users这样添加,直接写应用的名字:

django搭建项目配置环境和创建表过程详解

================================================================================================================================================================================

创建数据库

create database ttsx charset=utf8;

执行迁移

python manage.py makemigrations
python manage.py migrate

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python解析JSON数据的基本方法
Oct 15 Python
Python获取文件所在目录和文件名的方法
Jan 12 Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
python 解压pkl文件的方法
Oct 25 Python
django+mysql的使用示例
Nov 23 Python
Django框架视图函数设计示例
Jul 29 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 03 Python
如何理解python面向对象编程
Jun 01 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 #Python
Django使用中间键实现csrf认证详解
Jul 22 #Python
python Tcp协议发送和接收信息的例子
Jul 22 #Python
利用Python实现手机短信监控通知的方法
Jul 22 #Python
如何使用django的MTV开发模式返回一个网页
Jul 22 #Python
python3.7 sys模块的具体使用
Jul 22 #Python
使用 Python 处理 JSON 格式的数据
Jul 22 #Python
You might like
php 静态化实现代码
2009/03/20 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
jquery实现左右滑动菜单效果代码
2015/08/27 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
浅谈webpack性能榨汁机(打包速度优化)
2019/01/09 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
python语言中with as的用法使用详解
2018/02/23 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
python logging模块的使用详解
2020/10/23 Python
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
房屋过户委托书范本
2014/10/07 职场文书
面试通知短信
2015/04/20 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python