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解析中国天气网的天气数据
Mar 21 Python
python中列表元素连接方法join用法实例
Apr 07 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
Python格式化日期时间操作示例
Jun 28 Python
python学习之hook钩子的原理和使用
Oct 25 Python
对Python2与Python3中__bool__方法的差异详解
Nov 01 Python
详解Django配置优化方法
Nov 18 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
如何使用 Flask 做一个评论系统
Nov 27 Python
在python中对于bool布尔值的取反操作
Dec 11 Python
python中添加模块导入路径的方法
Feb 03 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
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
js简易namespace管理器 实例代码
2013/06/21 Javascript
node.js require() 源码解读
2015/12/13 Javascript
前端性能优化及技巧
2016/05/06 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
Vue表单输入绑定的示例代码
2018/11/01 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
Python中集合类型(set)学习小结
2015/01/28 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
python 中字典嵌套列表的方法
2018/07/03 Python
举例讲解Python常用模块
2019/03/08 Python
numpy.where() 用法详解
2019/05/27 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
物流管理应届生求职信
2013/11/07 职场文书
公务员转正考察材料
2014/02/07 职场文书
研究生毕业自我鉴定范文
2014/03/27 职场文书
运动会广播稿100字
2014/09/14 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
七个Python必备的GUI库
2021/04/27 Python