代码下载

github

教程

学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市

三、Models设计

3.1.项目初始化

(1)进虚拟环境下安装

  • django2.0.2
  • djangorestframework和相关依赖mark,filter
  • pillow  图片处理

pip install djangorestframeworkpip install -i https://pypi.douban.com/simple django==2.0.2pip install markdownpip install django-filterpip install pillowpip install pymysql

(2)创建项目

  • 项目:MxShop
  • app:users

 interpreter选择虚拟环境里面的python.exe

(3)Mysql的配置

settings中设置

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'mxshop',        #数据库名字'USER': 'root',          #账号'PASSWORD': '123456',    #密码'HOST': '127.0.0.1',     #IP'PORT': '3306',          #端口#这里引擎用innodb(默认myisam)#因为后面第三方登录时,要求引擎为INNODB# 'OPTIONS':{'init_command': 'SET storage_engine=INNODB'}, #这样设置会报错,改为"OPTIONS":{"init_command":"SET default_storage_engine=INNODB;"}}
}

安装Mysqlclient

下载地址:

https://www.lfd.uci.edu/~gohlke/pythonlibs/

安装

pip install mysqlclient-1.3.12-cp36-cp36m-win_amd64

__init__.py添加代码:

import pymysql
pymysql.install_as_MySQLdb()

(4)项目目录结构搭建

新建两个python package

  • extra_apps   (扩展的源码包)
  • apps              (放所有app)

新建两个文件夹

  • media       (保存图片)
  • db_tools   (数据库相关)

把extra_apps和apps标记为sources root,然后settings中也要加路径

#settings.pyimport syssys.path.insert(0,BASE_DIR)
sys.path.insert(0,os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0,os.path.join(BASE_DIR, 'extra_apps'))

现在项目目录如下:

3.2.users models设计

(1)创建三个app

  • goods        商品
  • trade          交易
  • user_operation       用户操作

(2)users/models.py

# users/models.py
__author__ = 'derek'from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUserclass UserProfile(AbstractUser):"""用户信息"""GENDER_CHOICES = (("male", u"男"),("female", u"女"))#用户用手机注册,所以姓名,生日和邮箱可以为空name = models.CharField("姓名",max_length=30, null=True, blank=True)birthday = models.DateField("出生年月",null=True, blank=True)gender = models.CharField("性别",max_length=6, choices=GENDER_CHOICES, default="female")mobile = models.CharField("电话",max_length=11)email = models.EmailField("邮箱",max_length=100, null=True, blank=True)class Meta:verbose_name = "用户信息"verbose_name_plural = verbose_namedef __str__(self):return self.usernameclass VerifyCode(models.Model):"""验证码"""code = models.CharField("验证码",max_length=10)mobile = models.CharField("电话",max_length=11)add_time = models.DateTimeField("添加时间",default=datetime.now)class Meta:verbose_name = "短信验证"verbose_name_plural = verbose_namedef __str__(self):return self.code

要想替换系统的用户,还要在settings中配置

#settings.py#重载系统的用户,让UserProfile生效
AUTH_USER_MODEL = 'users.UserProfile'

(3)这里UserProfile继承AbstractUser,可以看看AbstractUser的源码

 源码

3.3.goods的model设计

(1)安装

  • xadmin                              xadmin安装方法
  • DjangoUeditor                  富文本编辑器安装方法

安装好后把xadmin和DjangoUeditor放到extra_apps目录下面

(2)把四个app、xadmin和DjangoUeditor添加到 INSTALLED_APPS中

INSTALLED_APPS = ['django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','users','goods','trade','user_operation','rest_framework','xadmin','crispy_forms','DjangoUeditor'
]

设置media的保存路径

#settings.pyMEDIA_ROOT = os.path.join(BASE_DIR, "media")

(3)商品分类model 设计

class GoodsCategory(models.Model):"""商品分类"""CATEGORY_TYPE = ((1, "一级类目"),(2, "二级类目"),(3, "三级类目"),)name = models.CharField('类别名',default="", max_length=30,help_text="类别名")code = models.CharField("类别code",default="", max_length=30,help_text="类别code")desc = models.TextField("类别描述",default="",help_text="类别描述")#目录树级别category_type = models.IntegerField("类目级别",choices=CATEGORY_TYPE,help_text="类目级别")# 设置models有一个指向自己的外键parent_category = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, verbose_name="父类目级别", help_text="父目录",related_name="sub_cat")is_tab = models.BooleanField("是否导航",default=False,help_text="是否导航")add_time = models.DateTimeField("添加时间",default=datetime.now)class Meta:verbose_name = "商品类别"verbose_name_plural = verbose_namedef __str__(self):return self.name

(4)商品model设计

class Goods(models.Model):"""商品"""category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name="商品类目")goods_sn = models.CharField("商品唯一货号",max_length=50, default="")name = models.CharField("商品名",max_length=100,)click_num = models.IntegerField("点击数",default=0)sold_num = models.IntegerField("商品销售量",default=0)fav_num = models.IntegerField("收藏数",default=0)goods_num = models.IntegerField("库存数",default=0)market_price = models.FloatField("市场价格",default=0)shop_price = models.FloatField("本店价格",default=0)goods_brief = models.TextField("商品简短描述",max_length=500)goods_desc = UEditorField(verbose_name=u"内容", imagePath="goods/images/", width=1000, height=300,filePath="goods/files/", default='')ship_free = models.BooleanField("是否承担运费",default=True)# 首页中展示的商品封面图goods_front_image = models.ImageField(upload_to="goods/images/", null=True, blank=True, verbose_name="封面图")# 首页中新品展示is_new = models.BooleanField("是否新品",default=False)# 商品详情页的热卖商品,自行设置is_hot = models.BooleanField("是否热销",default=False)add_time = models.DateTimeField("添加时间",default=datetime.now)class Meta:verbose_name = '商品信息'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass GoodsImage(models.Model):"""商品轮播图"""goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品", related_name="images")image = models.ImageField(upload_to="", verbose_name="图片", null=True, blank=True)add_time = models.DateTimeField("添加时间", default=datetime.now)class Meta:verbose_name = '商品轮播'verbose_name_plural = verbose_namedef __str__(self):return self.goods.name

(4)首页商品轮播图model设计

因为首页的商品轮播图片是大图,跟商品详情里面的图片不一样,所以要单独写一个首页轮播图model

class Banner(models.Model):"""首页轮播的商品"""goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品")image = models.ImageField(upload_to='banner', verbose_name="轮播图片")index = models.IntegerField("轮播顺序",default=0)add_time = models.DateTimeField("添加时间", default=datetime.now)class Meta:verbose_name = '首页轮播'verbose_name_plural = verbose_namedef __str__(self):return self.goods.name

(5)商品广告和热搜model

class HotSearchWords(models.Model):"""搜索栏下方热搜词"""keywords = models.CharField("热搜词",default="", max_length=20)index = models.IntegerField("排序",default=0)add_time = models.DateTimeField("添加时间", default=datetime.now)class Meta:verbose_name = '热搜排行'verbose_name_plural = verbose_namedef __str__(self):return self.keywords

 goods/models.py

3.4.trade交易的model设计

trade/models.py

# trade/models.py
__author__ = 'derek'from datetime import datetime
from django.db import modelsfrom goods.models import Goods# get_user_model方法会去setting中找AUTH_USER_MODEL
from django.contrib.auth import get_user_model
User = get_user_model()# Create your models here.
class ShoppingCart(models.Model):"""购物车"""user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品")nums = models.IntegerField("购买数量",default=0)add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")class Meta:verbose_name = '购物车喵'verbose_name_plural = verbose_nameunique_together = ("user", "goods")def __str__(self):return "%s(%d)".format(self.goods.name, self.nums)class OrderInfo(models.Model):"""订单信息"""ORDER_STATUS = (("TRADE_SUCCESS", "成功"),("TRADE_CLOSED", "超时关闭"),("WAIT_BUYER_PAY", "交易创建"),("TRADE_FINISHED", "交易结束"),("paying", "待支付"),)PAY_TYPE = (("alipay", "支付宝"),("wechat", "微信"),)user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")#订单号唯一order_sn = models.CharField("订单编号",max_length=30, null=True, blank=True, unique=True)# 微信支付会用到nonce_str = models.CharField("随机加密串",max_length=50, null=True, blank=True, unique=True)# 支付宝交易号trade_no = models.CharField("交易号",max_length=100, unique=True, null=True, blank=True)#支付状态pay_status = models.CharField("订单状态",choices=ORDER_STATUS, default="paying", max_length=30)# 订单的支付类型pay_type = models.CharField("支付类型",choices=PAY_TYPE, default="alipay", max_length=10)post_script = models.CharField("订单留言",max_length=200)order_mount = models.FloatField("订单金额",default=0.0)pay_time = models.DateTimeField("支付时间",null=True, blank=True)# 用户信息address = models.CharField("收货地址",max_length=100, default="")signer_name = models.CharField("签收人",max_length=20, default="")singer_mobile = models.CharField("联系电话",max_length=11)add_time = models.DateTimeField("添加时间",default=datetime.now)class Meta:verbose_name = "订单信息"verbose_name_plural = verbose_namedef __str__(self):return str(self.order_sn)class OrderGoods(models.Model):"""订单内的商品详情"""# 一个订单对应多个商品order = models.ForeignKey(OrderInfo, on_delete=models.CASCADE, verbose_name="订单信息", related_name="goods")# 两个外键形成一张关联表goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品")goods_num = models.IntegerField("商品数量",default=0)add_time = models.DateTimeField("添加时间",default=datetime.now)class Meta:verbose_name = "订单商品"verbose_name_plural = verbose_namedef __str__(self):return str(self.order.order_sn)

3.5.用户操作的model设计

user_operation/models.py

# user_operation/models.py
__author__ = 'derek'from datetime import datetime
from django.db import models
from goods.models import Goodsfrom django.contrib.auth import get_user_model
User = get_user_model()class UserFav(models.Model):"""用户收藏操作"""user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品", help_text="商品id")add_time = models.DateTimeField("添加时间",default=datetime.now)class Meta:verbose_name = '用户收藏'verbose_name_plural = verbose_nameunique_together = ("user", "goods")def __str__(self):return self.user.usernameclass UserAddress(models.Model):"""用户收货地址"""user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户" )province = models.CharField("省份",max_length=100, default="")city = models.CharField("城市",max_length=100, default="")district = models.CharField("区域",max_length=100, default="")address = models.CharField("详细地址",max_length=100, default="")signer_name = models.CharField("签收人",max_length=100, default="")signer_mobile = models.CharField("电话",max_length=11, default="")add_time = models.DateTimeField("添加时间",default=datetime.now)class Meta:verbose_name = "收货地址"verbose_name_plural = verbose_namedef __str__(self):return self.addressclass UserLeavingMessage(models.Model):"""用户留言"""MESSAGE_CHOICES = ((1, "留言"),(2, "投诉"),(3, "询问"),(4, "售后"),(5, "求购"))user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")message_type = models.IntegerField(default=1, choices=MESSAGE_CHOICES, verbose_name="留言类型",help_text=u"留言类型: 1(留言),2(投诉),3(询问),4(售后),5(求购)")subject = models.CharField("主题",max_length=100, default="")message = models.TextField("留言内容",default="",help_text="留言内容")file = models.FileField(upload_to="message/images/", verbose_name="上传的文件", help_text="上传的文件")add_time = models.DateTimeField("添加时间",default=datetime.now)class Meta:verbose_name = "用户留言"verbose_name_plural = verbose_namedef __str__(self):return self.subject

Django REST framework+Vue 打造生鲜超市(二)相关推荐

  1. Django REST framework+Vue 打造生鲜超市(四)

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

  2. Django REST framework+Vue 打造生鲜超市(六)

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

  3. Django REST framework+Vue 打造生鲜超市(十)

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

  4. Django REST framework+Vue 打造生鲜超市(三)

    代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 四.xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugi ...

  5. Django REST framework+Vue 打造生鲜超市(十三)

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

  6. Django REST framework+Vue 打造生鲜超市(五)

    六.商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级 一种是某一类的分类以及商品详细信息: 开始写商品分类的接口 (2)序列化 给分类添加三级分类 ...

  7. Django进阶 Django REST framework+Vue 打造生鲜超市第一天 搭建环境

    新人学习django 是按照这个大佬的教程学习的 链接: https://www.cnblogs.com/derek1184405959/p/8733194.html. 很多步骤都是按照上面的教程学习 ...

  8. Django REST framework+Vue 打造生鲜电商项目(笔记八)

    (form:http://www.cnblogs.com/derek1184405959/p/8862569.html) 十一.pycharm 远程代码调试 第三方登录和支付,都需要有服务器才行(回调 ...

  9. python全栈生鲜电商_Django REST framework+Vue 打造生鲜电商项目(笔记十)

    (from:https://www.cnblogs.com/derek1184405959/p/8877643.html  有修改) 十三.首页.商品数量.缓存和限速功能开发 首先把pycharm环境 ...

最新文章

  1. java 解释型和编译型
  2. 三十三、分治算法---汉诺塔问题
  3. centos6.5下载卸载mysql_Linux CentOS 6.5 卸载、tar安装MySQL
  4. Re-installation failed due to different application signatures.
  5. DevNet网站上线
  6. 【python】用正则表达式进行文字局部替换
  7. 舞伴配对问题java_舞伴配对问题
  8. 针对JDK 14提议的另外六个JEP
  9. python去重复元素_Python实现去除列表中重复元素的方法总结【7种方法】
  10. 通过脚本提示是否提交并将表单发向另一页面处理!!
  11. Linux yum仓库的安装
  12. Transformers中的Beam Search高效实现
  13. 【职场酸甜苦辣咸】+IT女汉子坚持的梦想和原则
  14. 鉴源实验室丨车载ECU嵌入式软件的测试入门
  15. unity 安装遇到问题
  16. 物联网嵌入式STM32资料大全,超100G
  17. Android Studio之Activity简介
  18. '什么意思 怎么输入
  19. JetBrain全家桶介绍
  20. 用友文件输出在服务器电脑,用友软件电脑怎么远程连接服务器

热门文章

  1. 新库上线 | CnOpenData 新三板公司专利及引用被引用数据
  2. SBR笔记:Self-Supervised Hypergraph Convolutional Networks for Session-based Recommendation
  3. IPP SWAP算力LP挖矿系统搭建开发孵化器原理
  4. PetStore项目总结
  5. 去重的几种方法(部分)
  6. java图书推荐推荐管理系统
  7. pixel手机升系统
  8. 由爆火的“羊了个羊”浅谈小游戏开发
  9. 公司尽然把cnblogs给屏蔽了,可恶!!!
  10. 油气开采上百年,技术依旧原始,硬伤在这儿