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 生成目录树及显示文件大小的代码
Jul 23 Python
Python写的一个简单监控系统
Jun 19 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
Python编程argparse入门浅析
Feb 07 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
python将list转为matrix的方法
Dec 12 Python
python pyenv多版本管理工具的使用
Dec 23 Python
python正则表达式匹配IP代码实例
Dec 28 Python
python 使用openpyxl读取excel数据
Feb 18 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多文件上传实现代码
2014/02/20 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
Symfony核心类概述
2016/03/17 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
Js中sort()方法的用法
2006/11/04 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
python中的hashlib和base64加密模块使用实例
2014/09/02 Python
python变量不能以数字打头详解
2016/07/06 Python
python2.7的编码问题与解决方法
2016/10/04 Python
python写一个md5解密器示例
2018/02/23 Python
PyQt5每天必学之布局管理
2018/04/19 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
2014司机年终工作总结
2014/12/05 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
MySQL 计算连续登录天数
2022/05/11 MySQL