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 25 Python
python制作花瓣网美女图片爬虫
Oct 28 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
python3实现多线程聊天室
Dec 12 Python
Python3实现的判断回文链表算法示例
Mar 08 Python
python3.7简单的爬虫实例详解
Jul 08 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
pandas中ix的使用详细讲解
Mar 09 Python
jupyter notebook中美观显示矩阵实例
Apr 17 Python
不到20行实现Python代码即可制作精美证件照
Apr 24 Python
Python sublime安装及配置过程详解
Jun 29 Python
python中子类与父类的关系基础知识点
Feb 02 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
joomla内置的表单验证功能使用方法
2010/06/11 PHP
php定界符
2014/06/19 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
详解Python中is和==的区别
2019/03/21 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
delegate与普通函数的区别
2014/01/22 面试题
师生聚会感言
2014/01/26 职场文书
初三政治教学反思
2014/01/30 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
依法行政工作汇报
2014/10/28 职场文书
北京爱情故事观后感
2015/06/12 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP