django搭建项目配置环境和创建表过程详解
作者:Crazymagic 发布时间:2022-10-26 19:03:25
1. 搭建项目配置环境和创建表
创建一个ttsx的项目
django-admin startproject ttsx
在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文件如下图:
在 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目录用来存储所有的应用:
分别创建 应用 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这样添加,直接写应用的名字:
================================================================================================================================================================================
创建数据库
create database ttsx charset=utf8;
执行迁移
python manage.py makemigrations
python manage.py migrate
来源:https://www.cnblogs.com/crazymagic/articles/7695231.html


猜你喜欢
- (在lua中通过loadfile, setfenv实现)python当然也可以:cat config.pybar = 10foo=100ca
- 从这篇开始,用一个新的系列文章去介绍和学习MySQL。为什么要学习MySQL,从产品角度来说,大部分软件的数据库服务还是采取关系型数据库,主
- 列表1~n输出步长为3的分组print([[x for x in range(1,101)][i:i+3] for i in range(0
- 某大师曾说过,像了解自己的老婆 一样了解自己管理的数据库,个人认为包含了两个方面的了解:1,在稳定性层面来说,更多的是关注高可用、读写分离、
- 在进行PHP编程时,需要对服务器某个目录下面的文件进行浏览,通常成为遍历目录。取得一个目录下的文件和子目录,就需要用到opendir()函数
- 使用Requests测试带签名的接口部分业务为了安全需要,需要对接口请求数据做签名校验,一般制定一下规则1、业务方接入系统,需申请业务ID以
- 语言的问题,见仁见智,基本上属于信仰,无法强求一致。不过作为Python的爱好者,我想在这里为Python做一点辩护。就语法来看,Pytho
- 1、设置无头浏览器模式from selenium import webdriverfrom selenium.webdriver.chrom
- 引言事情是这样的,最近在做开源软件供应链安全相关的项目,之前没了解这方面知识的时候感觉服务器被黑,数据库被删,网站被攻,这些东西都离我们太遥
- 一、前言嗨,大家好,我是新发。有同学私信我让我写一篇Unity网格相关的教程,那我就带大家来一次Unity的网格探险之旅吧~二、Hello
- discuz注册时,会把密码按一个规则加密。比如我的密码是123456echo md5("123456");
- <%@ transaction = required %><%response.b
- 一、简介eval()函数用来执行一个字符表达式的值,并返回表达式的值二、语法具体语法:eval(expression[, globals[,
- Python 3 利用 Dlib 19.7 实现摄像头人脸检测特征点标定0.引言利用python开发,借助Dlib库捕获摄像头中的人脸,进行
- 本文实例为大家分享了vue实现Input输入框模糊查询方法的具体代码,供大家参考,具体内容如下原理:原生js的indexOf() 方法,该方
- 微信小程序 scroll-view实现上拉加载与下拉刷新的实例实现效果图:如图,使用小程序的scroll-view实现的上拉加载数据,下拉刷
- 在Python的网络编程中,getservbyport()函数和getservbyname()函数是socket模块中的两个函数,因此在使用
- 将ASCII字符转换为对应的数值即‘a'-->65,使用ord函数,ord('a')反之,使用chr函数,将数
- github指路作业要求友情提示ldw老师给の友情提示(虽然感觉也还好/dbq其实还挺有用的)课上讲的例子是图片展示器(能够实现打开图片+镜
- 在中文分词中,jiebe库是最为常见的,主要的原因还是它独特的支持分词模式如:精确模式、全模式、搜索引擎模式。也对应着三种方式,包括jieb