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
猜你喜欢
- 1. 得到安全字符串,在查询中使用,过滤单引号。Function Get_SafeStr(str) &nb
- 【内容】: 最近python挺火,空闲时间看了几个python视频,觉得简单易懂,开发效
- PyTorch与PyTorch Geometric的安装GPU与CUDA,Python,PyTorch的匹配1. 查看Linux系统中GPU
- 准备工作右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库。转成灰度图像调用i
- 在网上找到的随机不重复查询代码:select top 15 * from article&
- IEBlog公布了开发中的Internet Explorer 8 Beta2版本的最新功能.IE8 Beta2在第一个版本的基础上做出了很大
- 前言最近助教改作业导出的成绩表格跟老师给的名单顺序不一致,脑壳一亮就用pandas写了个脚本自动吧原始导出的成绩誊写到老师给的名单中了哈哈哈
- 【作者翻译】结构和层次降低了复杂性并提高了可读性。你的文章或站点组织的越深入,用户就越容易理解你观点和得到你想传达的信息。在网页上,这点被通
- 一、数据类型分类1、按存值个数区分单个值:数字,字符串多个值(容器):列表,元组,字典,集合2、按可变不可变区分可变:列表[],字典{},集
- 这篇文章与大家分享13个超级有用的 jQuery 内容滚动插件和教程。您可能经常能看到一些网站上特色区域的内容以滚动方式变化,这是一种在有限
- 1. 匿名函数匿名函数(anonymous function)是指未与任何标识符绑定的函数,多用在functional programmin
- 1. 将Oracle 10g client安装包copy到本地才能安装:2. 双击setup 的到:3. 稍后进入安装界面:4. 选择下一步
- 做过主页的朋友,几乎没有一个人没用到它,它使我们排版更加轻松。有人说DW的表格没有Fp的好用,我认为不
- js浮点数计算有时是不准确的,比如7*0.8 == 7*8/10的值为false,因为7*0.8=5.6000000000000005,乘出
- Go语言集成开发环境之VS Code安装使用VS Code是微软开源的一款编辑器,插件系统十分的丰富。下面介绍如何用VS Code搭建go语
- 在linux服务器lvs负载均衡、双机热备应用中经常用到mysql双机热备,安装和配置过程如下:一、 安装MYSQL# cp mysql-s
- 或许你知道,Internet Explorer 6 已经不是最先进的浏览器了。事实上,它已经八岁了,但是很多人还在使用这个不安全的浏览器。正
- 这些常量在 PHP 的内核中定义。它包含 PHP、Zend 引擎和 SAPI 模
- php高并发之opcache今天工作的时候接触到客户的一台服务器,业务逻辑比较简单 。估算pv在120w左右吧,用的是阿里云2c4g的服务器
- 本文实例讲述了python连接字符串的方法。分享给大家供大家参考。具体如下:方法1:直接通过加号操作符相加foobar = 'foo