1.数据表设计与导入
因为做项目断了二个月没学这个教程了。这部分是之前看了,就根据之前做的笔记提交上来,重新温故一下。看这个教程自己主要的目的是:加深对django rest framework的理解。
一、项目环境搭建。
1.本地虚拟机环境信息
1 cat /etc/issue 2 lsb_release -a

2.创建虚拟环境
之前安装的笔记为:
1 pip install virtualenvwrapper 2 # 找到该文件的位置 3 sudo find / -name virtualenvwrapper.sh 4 /usr/local/bin/virtualenvwrapper.sh 5 # 复制该路径 6 vim ~/.bashrc 7 #修改相应的路径 8 export WORKON_HOME=$HOME/.virttualenvs 9 source /usr/local/bin/virtualenvwrapper.sh 10 # 让它生效 11 source ~/.bashrc 12 mkvirtualenv py2scrapy 13 rm -rf py2scrap 14 # 删除相应文件就是删除虚拟环境 15 mkvirtualenv --python=/usr/bin/python3 py3scrapy
创建自己对应的虚拟环境(MxShop)、并设置别名
1 #创建虚拟环境 2 mkvirtualenv MxShop 3 #设置虚拟环境中python的别名MxShopPython 4 vi /root/.bashrc 5 # 添加以下内容 6 # some more ls aliases 7 ... 8 alias MxShopPython='/root/.virttualenvs/MxShop/bin/python' 9 # 让别名生效 10 source /root/.bashrc 11 # 启动项目 12 MxShopPython manage.py runserver 0.0.0.0:8088



在虚拟环境中添加常用工具:django等。
# 退出当前环境 deactivate # 进入虚拟环境 workon MxShop # 接下就是用pip安装相关的东西 pip install django==1.11

3.创建项目MxShop:(django相关知识可参考:http://www.cnblogs.com/yuanchenqi/articles/6083427.html)
1 # 创建django项目 2 /root/.virttualenvs/MxShop/bin/django-admin.py startproject MxShop 3 # 因为一个项目下来,这个命令就只用一次,所有就没必要添加别名了 4 cd MxShop 5 MxShopPython manage.py 6 # 测试下是否正常

4.数据库配置(工具:Navicat)
这方面自己很熟悉就不多写了。先用Navicate(工具使用,可百度一下,傻瓜式使用方法)连接进虚拟机中的Mysql,再创建数据库MxShop,再在MxShop项目中的settings.py中配置下数据库(上面的django博客中已有相关介绍)。
环境中缺少myql驱动,修改如下:
1 apt-get install libmysqlclient-dev 2 pip install mysqlclient
二、开始项目(新建相关应用与数据表设计)
1.新建应用
1 # 新建apps包==》将所有的app放进来 2 # 新建extra_apps==>放第三方的app包 3 4 # /media:保存上传的文件之类 5 # /templates: 6 # /db_tools:放一些python脚本 7 8 # pythoncharm小技巧:文件夹==》右键==》market root 9 10 # 创建相关应用 11 MxShopPython manage.py startapp goods 12 MxShopPython manage.py startapp trade 13 MxShopPython manage.py startapp user_operation 14 MxShopPython manage.py startapp users 15 MxShopPython manage.py startapp utils
让系统自动识别到对应的apps与extra_apps:
1 import os, sys 2 3 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 5 6 sys.path.insert(0, os.path.join(BASE_DIR, 'apps')) 7 sys.path.insert(1, os.path.join(BASE_DIR, 'extra_apps'))

目录结构:

2.数据表设计
goods:
1 from datetime import datetime 2 3 from django.db import models 4 from DjangoUeditor.models import UEditorField 5 # Create your models here. 6 7 8 class GoodsCategory(models.Model): 9 """ 10 商品类别 11 """ 12 CATEGORY_TYPE = ( 13 (1, "一级类目"), 14 (2, "二级类目"), 15 (3, "三级类目"), 16 ) 17 18 name = models.CharField(default="", max_length=30, verbose_name="类别名", help_text="类别名") 19 code = models.CharField(default="", max_length=30, verbose_name="类别code", help_text="类别code") 20 desc = models.TextField(default="", verbose_name="类别描述", help_text="类别描述") 21 category_type = models.IntegerField(choices=CATEGORY_TYPE, verbose_name="类目级别", help_text="类目级别") 22 parent_category = models.ForeignKey("self", null=True, blank=True, verbose_name="父类目级别", help_text="父目录", 23 related_name="sub_cat") 24 is_tab = models.BooleanField(default=False, verbose_name="是否导航", help_text="是否导航") 25 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 26 27 class Meta: 28 verbose_name = "商品类别" 29 verbose_name_plural = verbose_name 30 31 def __str__(self): 32 return self.name 33 34 35 class GoodsCategoryBrand(models.Model): 36 """ 37 品牌名 38 """ 39 category = models.ForeignKey(GoodsCategory, related_name='brands', null=True, blank=True, verbose_name="商品类目") 40 name = models.CharField(default="", max_length=30, verbose_name="品牌名", help_text="品牌名") 41 desc = models.TextField(default="", max_length=200, verbose_name="品牌描述", help_text="品牌描述") 42 image = models.ImageField(max_length=200, upload_to="brands/") 43 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 44 45 class Meta: 46 verbose_name = "品牌" 47 verbose_name_plural = verbose_name 48 db_table = "goods_goodsbrand" 49 50 def __str__(self): 51 return self.name 52 53 54 class Goods(models.Model): 55 """ 56 商品 57 """ 58 category = models.ForeignKey(GoodsCategory, verbose_name="商品类目") 59 goods_sn = models.CharField(max_length=50, default="", verbose_name="商品唯一货号") 60 name = models.CharField(max_length=100, verbose_name="商品名") 61 click_num = models.IntegerField(default=0, verbose_name="点击数") 62 sold_num = models.IntegerField(default=0, verbose_name="商品销售量") 63 fav_num = models.IntegerField(default=0, verbose_name="收藏数") 64 goods_num = models.IntegerField(default=0, verbose_name="库存数") 65 market_price = models.FloatField(default=0, verbose_name="市场价格") 66 shop_price = models.FloatField(default=0, verbose_name="本店价格") 67 goods_brief = models.TextField(max_length=500, verbose_name="商品简短描述") 68 goods_desc = UEditorField(verbose_name=u"内容", imagePath="goods/images/", width=1000, height=300, 69 filePath="goods/files/", default='') 70 ship_free = models.BooleanField(default=True, verbose_name="是否承担运费") 71 goods_front_image = models.ImageField(upload_to="goods/images/", null=True, blank=True, verbose_name="封面图") 72 is_new = models.BooleanField(default=False, verbose_name="是否新品") 73 is_hot = models.BooleanField(default=False, verbose_name="是否热销") 74 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 75 76 class Meta: 77 verbose_name = '商品' 78 verbose_name_plural = verbose_name 79 80 def __str__(self): 81 return self.name 82 83 84 class IndexAd(models.Model): 85 category = models.ForeignKey(GoodsCategory, related_name='category',verbose_name="商品类目") 86 goods =models.ForeignKey(Goods, related_name='goods') 87 88 class Meta: 89 verbose_name = '首页商品类别广告' 90 verbose_name_plural = verbose_name 91 92 def __str__(self): 93 return self.goods.name 94 95 96 class GoodsImage(models.Model): 97 """ 98 商品轮播图 99 """ 100 goods = models.ForeignKey(Goods, verbose_name="商品", related_name="images") 101 image = models.ImageField(upload_to="", verbose_name="图片", null=True, blank=True) 102 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 103 104 class Meta: 105 verbose_name = '商品图片' 106 verbose_name_plural = verbose_name 107 108 def __str__(self): 109 return self.goods.name 110 111 112 class Banner(models.Model): 113 """ 114 轮播的商品 115 """ 116 goods = models.ForeignKey(Goods, verbose_name="商品") 117 image = models.ImageField(upload_to='banner', verbose_name="轮播图片") 118 index = models.IntegerField(default=0, verbose_name="轮播顺序") 119 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 120 121 class Meta: 122 verbose_name = '轮播商品' 123 verbose_name_plural = verbose_name 124 125 def __str__(self): 126 return self.goods.name 127 128 129 class HotSearchWords(models.Model): 130 """ 131 热搜词 132 """ 133 keywords = models.CharField(default="", max_length=20, verbose_name="热搜词") 134 index = models.IntegerField(default=0, verbose_name="排序") 135 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 136 137 class Meta: 138 verbose_name = '热搜词' 139 verbose_name_plural = verbose_name 140 141 def __str__(self): 142 return self.keywords
trade:
1 from datetime import datetime 2 3 from django.db import models 4 from django.contrib.auth import get_user_model 5 6 from goods.models import Goods 7 User = get_user_model() 8 # Create your models here. 9 10 11 class ShoppingCart(models.Model): 12 """ 13 购物车 14 """ 15 user = models.ForeignKey(User, verbose_name=u"用户") 16 goods = models.ForeignKey(Goods, verbose_name=u"商品") 17 nums = models.IntegerField(default=0, verbose_name="购买数量") 18 19 add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间") 20 21 class Meta: 22 verbose_name = '购物车' 23 verbose_name_plural = verbose_name 24 unique_together = ("user", "goods") 25 26 def __str__(self): 27 return "%s(%d)".format(self.goods.name, self.nums) 28 29 30 class OrderInfo(models.Model): 31 """ 32 订单 33 """ 34 ORDER_STATUS = ( 35 ("TRADE_SUCCESS", "成功"), 36 ("TRADE_CLOSED", "超时关闭"), 37 ("WAIT_BUYER_PAY", "交易创建"), 38 ("TRADE_FINISHED", "交易结束"), 39 ("paying", "待支付"), 40 ) 41 42 user = models.ForeignKey(User, verbose_name="用户") 43 order_sn = models.CharField(max_length=30, null=True, blank=True, unique=True, verbose_name="订单号") 44 trade_no = models.CharField(max_length=100, unique=True, null=True, blank=True, verbose_name=u"交易号") 45 pay_status = models.CharField(choices=ORDER_STATUS, default="paying", max_length=30, verbose_name="订单状态") 46 post_script = models.CharField(max_length=200, verbose_name="订单留言") 47 order_mount = models.FloatField(default=0.0, verbose_name="订单金额") 48 pay_time = models.DateTimeField(null=True, blank=True, verbose_name="支付时间") 49 50 # 用户信息 51 address = models.CharField(max_length=100, default="", verbose_name="收货地址") 52 signer_name = models.CharField(max_length=20, default="", verbose_name="签收人") 53 singer_mobile = models.CharField(max_length=11, verbose_name="联系电话") 54 55 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 56 57 class Meta: 58 verbose_name = u"订单" 59 verbose_name_plural = verbose_name 60 61 def __str__(self): 62 return str(self.order_sn) 63 64 class OrderGoods(models.Model): 65 """ 66 订单的商品详情 67 """ 68 order = models.ForeignKey(OrderInfo, verbose_name="订单信息", related_name="goods") 69 goods = models.ForeignKey(Goods, verbose_name="商品") 70 goods_num = models.IntegerField(default=0, verbose_name="商品数量") 71 72 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 73 74 class Meta: 75 verbose_name = "订单商品" 76 verbose_name_plural = verbose_name 77 78 def __str__(self): 79 return str(self.order.order_sn)
user_operation:
1 from datetime import datetime 2 3 from django.db import models 4 from django.contrib.auth import get_user_model 5 6 from goods.models import Goods 7 # Create your models here. 8 User = get_user_model() 9 10 11 class UserFav(models.Model): 12 """ 13 用户收藏 14 """ 15 user = models.ForeignKey(User, verbose_name="用户") 16 goods = models.ForeignKey(Goods, verbose_name="商品", help_text="商品id") 17 add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间") 18 19 class Meta: 20 verbose_name = '用户收藏' 21 verbose_name_plural = verbose_name 22 unique_together = ("user", "goods") 23 24 def __str__(self): 25 return self.user.username 26 27 28 class UserLeavingMessage(models.Model): 29 """ 30 用户留言 31 """ 32 MESSAGE_CHOICES = ( 33 (1, "留言"), 34 (2, "投诉"), 35 (3, "询问"), 36 (4, "售后"), 37 (5, "求购") 38 ) 39 user = models.ForeignKey(User, verbose_name="用户") 40 message_type = models.IntegerField(default=1, choices=MESSAGE_CHOICES, verbose_name="留言类型", 41 help_text=u"留言类型: 1(留言),2(投诉),3(询问),4(售后),5(求购)") 42 subject = models.CharField(max_length=100, default="", verbose_name="主题") 43 message = models.TextField(default="", verbose_name="留言内容", help_text="留言内容") 44 file = models.FileField(upload_to="message/images/", verbose_name="上传的文件", help_text="上传的文件") 45 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 46 47 class Meta: 48 verbose_name = "用户留言" 49 verbose_name_plural = verbose_name 50 51 def __str__(self): 52 return self.subject 53 54 55 class UserAddress(models.Model): 56 """ 57 用户收货地址 58 """ 59 user = models.ForeignKey(User, verbose_name="用户" ) 60 province = models.CharField(max_length=100, default="", verbose_name="省份") 61 city = models.CharField(max_length=100, default="", verbose_name="城市") 62 district = models.CharField(max_length=100, default="", verbose_name="区域") 63 address = models.CharField(max_length=100, default="", verbose_name="详细地址") 64 signer_name = models.CharField(max_length=100, default="", verbose_name="签收人") 65 signer_mobile = models.CharField(max_length=11, default="", verbose_name="电话") 66 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 67 68 class Meta: 69 verbose_name = "收货地址" 70 verbose_name_plural = verbose_name 71 72 def __str__(self): 73 return self.address
users:
1 from datetime import datetime 2 3 from django.db import models 4 from django.contrib.auth.models import AbstractUser 5 6 # Create your models here. 7 8 9 class UserProfile(AbstractUser): 10 """ 11 用户 12 """ 13 name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名") 14 birthday = models.DateField(null=True, blank=True, verbose_name="出生年月") 15 gender = models.CharField(max_length=6, choices=(("male", u"男"), ("female", "女")), default="female", verbose_name="性别") 16 mobile = models.CharField(null=True, blank=True, max_length=11, verbose_name="电话") 17 email = models.EmailField(max_length=100, null=True, blank=True, verbose_name="邮箱") 18 19 class Meta: 20 verbose_name = "用户" 21 verbose_name_plural = verbose_name 22 23 def __str__(self): 24 return self.username 25 26 27 class VerifyCode(models.Model): 28 """ 29 短信验证码 30 """ 31 code = models.CharField(max_length=10, verbose_name="验证码") 32 mobile = models.CharField(max_length=11, verbose_name="电话") 33 add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") 34 35 class Meta: 36 verbose_name = "短信验证码" 37 verbose_name_plural = verbose_name 38 39 def __str__(self): 40 return self.code
3.数据插入(直接在db_tools写了二个脚本:import_category_data.py和import_goods_data.py)
import_goods_data.py
1 # -*- coding: utf-8 -*- 2 3 import sys 4 import os 5 6 7 pwd = os.path.dirname(os.path.realpath(__file__)) 8 # 获取上级目录s 9 pwd = os.path.dirname(pwd) 10 sys.path.append(pwd) 11 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MxShop.settings") 12 13 import django 14 django.setup() 15 16 from goods.models import Goods, GoodsCategory, GoodsImage 17 18 from db_tools.data.product_data import row_data 19 20 for goods_detail in row_data: 21 goods = Goods() 22 goods.name = goods_detail["name"] 23 goods.market_price = float(int(goods_detail["market_price"].replace("¥", "").replace("元", ""))) 24 goods.shop_price = float(int(goods_detail["sale_price"].replace("¥", "").replace("元", ""))) 25 goods.goods_brief = goods_detail["desc"] if goods_detail["desc"] is not None else "" 26 goods.goods_desc = goods_detail["goods_desc"] if goods_detail["goods_desc"] is not None else "" 27 goods.goods_front_image = goods_detail["images"][0] if goods_detail["images"] else "" 28 29 category_name = goods_detail["categorys"][-1] 30 category = GoodsCategory.objects.filter(name=category_name) 31 if category: 32 goods.category = category[0] 33 goods.save() 34 35 for goods_image in goods_detail["images"]: 36 goods_image_instance = GoodsImage() 37 goods_image_instance.image = goods_image 38 goods_image_instance.goods = goods 39 goods_image_instance.save()
import_category_data.py:
1 # -*- coding: utf-8 -*- 2 3 4 #独立使用django的model 5 import sys 6 import os 7 8 9 pwd = os.path.dirname(os.path.realpath(__file__)) 10 # 获取上级目录 11 pwd = os.path.dirname(pwd) 12 sys.path.append(pwd) 13 # 下面注释掉那个windows下有效,但在linux下会失效 14 # sys.path.append(pwd+"/..") 15 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MxShop.settings") 16 17 import django 18 django.setup() 19 20 from goods.models import GoodsCategory 21 22 from db_tools.data.category_data import row_data 23 24 for lev1_cat in row_data: 25 lev1_intance = GoodsCategory() 26 lev1_intance.code = lev1_cat["code"] 27 lev1_intance.name = lev1_cat["name"] 28 lev1_intance.category_type = 1 29 lev1_intance.save() 30 31 for lev2_cat in lev1_cat["sub_categorys"]: 32 lev2_intance = GoodsCategory() 33 lev2_intance.code = lev2_cat["code"] 34 lev2_intance.name = lev2_cat["name"] 35 lev2_intance.category_type = 2 36 lev2_intance.parent_category = lev1_intance 37 lev2_intance.save() 38 39 for lev3_cat in lev2_cat["sub_categorys"]: 40 lev3_intance = GoodsCategory() 41 lev3_intance.code = lev3_cat["code"] 42 lev3_intance.name = lev3_cat["name"] 43 lev3_intance.category_type = 3 44 lev3_intance.parent_category = lev2_intance 45 lev3_intance.save()
                    
                
                
            
        
浙公网安备 33010602011771号