2.导入商品类别和商品数据
现在是没有数据的,但是为了测试的方便,需要制造一些测试数据并导入。需要将测试商品的图片文件导入到media/goods目录下,将测试品牌的图片文件导入到media/brands目录下。
然后在db_tools目录下创建名为data的Package,下创建商品数据product_data.py如下:
row_data = [ { 'images': [ 'goods/images/1_P_1449024889889.jpg', 'goods/images/1_P_1449024889264.jpg', 'goods/images/1_P_1449024889726.jpg', 'goods/images/1_P_1449024889018.jpg', 'goods/images/1_P_1449024889287.jpg' ], 'categorys': [ '首页', '生鲜食品', '根茎类' ], 'market_price': '¥232元', 'name': '新鲜水果甜蜜香脆单果约800克', 'desc': '食用百香果可以增加胃部饱腹感,减少余热量的摄入,还可以吸附胆固醇和胆汁之类有机分子,抑制人体对脂肪的吸收。因此,长期食用有利于改善人体营养吸收结构,降低体内脂肪,塑造健康优美体态。', 'sale_price': '¥156元', 'goods_desc': '<p><img src="/media/goods/images/2_20170719161405_249.jpg" title="" alt="2.jpg"/></p><p><img src="/media/goods/images/2_20170719161414_628.jpg" title="" alt="2.jpg"/></p><p><img src="/media/goods/images/2_20170719161435_381.jpg" title="" alt="2.jpg"/></p>' }, ..., { 'sale_price': '¥12元', 'images': [ 'goods/images/29_P_1448947631994.jpg' ], 'market_price': '¥14元', 'categorys': [ '首页', '粮油副食', '食用油' ], 'desc': None, 'name': '融氏纯玉米胚芽油5l桶', 'goods_desc': '<p><img src="/media/goods/images/2_20170719161405_249.jpg" title="" alt="2.jpg"/></p><p><img src="/media/goods/images/2_20170719161414_628.jpg" title="" alt="2.jpg"/></p><p><img src="/media/goods/images/2_20170719161435_381.jpg" title="" alt="2.jpg"/></p>' } ] pass
再创建category_data.py如下:
row_data = [ { 'sub_categorys': [ { 'sub_categorys': [ { 'code': 'yr', 'name': '羊肉' }, { 'code': 'ql', 'name': '禽类' }, { 'code': 'zr', 'name': '猪肉' }, { 'code': 'nr', 'name': '牛肉' } ], 'code': 'jprl', 'name': '精品肉类' }, { 'sub_categorys': [ { 'code': 'cb', 'name': '参鲍' }, { 'code': 'yu', 'name': '鱼' }, { 'code': 'xia', 'name': '虾' }, { 'code': 'xb', 'name': '蟹/贝' } ], 'code': 'hxsc', 'name': '海鲜水产' }, { 'sub_categorys': [ { 'code': 'xhd_xyd', 'name': '松花蛋/咸鸭蛋' }, { 'code': 'jd', 'name': '鸡蛋' } ], 'code': 'dzp', 'name': '蛋制品' }, { 'sub_categorys': [ { 'code': 'sc', 'name': '生菜' }, { 'code': 'bc', 'name': '菠菜' }, { 'code': 'yj', 'name': '圆椒' }, { 'code': 'xlh', 'name': '西兰花' } ], 'code': 'ycl', 'name': '叶菜类' }, { 'sub_categorys': [ ], 'code': 'gjl', 'name': '根茎类' }, { 'sub_categorys': [ ], 'code': 'qgl', 'name': '茄果类' }, { 'sub_categorys': [ ], 'code': 'jgl', 'name': '菌菇类' }, { 'sub_categorys': [ ], 'code': 'jksx', 'name': '进口生鲜' } ], 'code': 'sxsp', 'name': '生鲜食品' }, ..., { 'sub_categorys': [ { 'sub_categorys': [ ], 'code': '白茶', 'name': '白茶' }, { 'sub_categorys': [ ], 'code': '红茶', 'name': '红茶' }, { 'sub_categorys': [ ], 'code': '绿茶', 'name': '绿茶' } ], 'code': '精选茗茶', 'name': '精选茗茶' } ]
因为存在外键的限制,因此必须先导入category数据,再导入商品数据,这里需要独立于项目单独使用Django的Model。
先创建import_category_data.py如下:
import sys, os pwd = os.path.dirname(os.path.realpath(__file__)) sys.path.append(pwd + '../') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Fresh_Ecommerce.settings') import django django.setup() from goods.models import GoodsCategory # 不能位于前面的代码之前,否则会出错 from db_tools.data.category_data import raw_data for lev1_cat in raw_data: lev1_instance = GoodsCategory() lev1_instance.code = lev1_cat['code'] lev1_instance.name = lev1_cat['name'] lev1_instance.category_type = 1 lev1_instance.save() for lev2_cat in lev1_cat['sub_categorys']: lev2_instance = GoodsCategory() lev2_instance.code = lev2_cat['code'] lev2_instance.name = lev2_cat['name'] lev2_instance.category_type = 2 lev2_instance.parent_category = lev1_instance lev2_instance.save() for lev3_cat in lev2_cat['sub_categorys']: lev3_instance = GoodsCategory() lev3_instance.code = lev3_cat['code'] lev3_instance.name = lev3_cat['name'] lev3_instance.category_type = 3 lev3_instance.parent_category = lev2_instance lev3_instance.save() print('Category data imported successfully')
单独运行该文件,打印:
Category data imported successfully
显然,执行成功。
说明:
因为这里是单独使用Django的model,因此需要先进行路径的设置,来保证可以访问项目和app中的内容,所以:
from goods.models import GoodsCategory
必须在
import sys, os pwd = os.path.dirname(os.path.realpath(__file__)) sys.path.append(pwd + '../') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Fresh_Ecommerce.settings') import django django.setup()
之后,否则会报错。
此时再查询数据据库如下:
select * from goods_goodscategory;
打印:
+-----+---------------------+---------------------+------+---------------+--------+-----------+--------------------+------------+ | id | name | code | desc | category_type | is_tab | is_delete | parent_category_id | add_time | +-----+---------------------+---------------------+------+---------------+--------+-----------+--------------------+------------+ | 1 | 生鲜食品 | sxsp | | 1 | 0 | 0 | NULL | 2020-07-21 | | 2 | 精品肉类 | jprl | | 2 | 0 | 0 | 1 | 2020-07-21 | | 3 | 羊肉 | yr | | 3 | 0 | 0 | 2 | 2020-07-21 | | 4 | 禽类 | ql | | 3 | 0 | 0 | 2 | 2020-07-21 | | 5 | 猪肉 | zr | | 3 | 0 | 0 | 2 | 2020-07-21 | ... | 116 | 腊味 | 腊味 | | 2 | 0 | 0 | 108 | 2020-07-21 | | 117 | 精选茗茶 | 精选茗茶 | | 1 | 0 | 0 | NULL | 2020-07-21 | | 118 | 白茶 | 白茶 | | 2 | 0 | 0 | 117 | 2020-07-21 | | 119 | 红茶 | 红茶 | | 2 | 0 | 0 | 117 | 2020-07-21 | | 120 | 绿茶 | 绿茶 | | 2 | 0 | 0 | 117 | 2020-07-21 | +-----+---------------------+---------------------+------+---------------+--------+-----------+--------------------+------------+ 120 rows in set (0.01 sec)
可以看到,共120条数据,分3个类别。
再查看后台管理系统如下:
显然,可以清晰地看到每个商品类别的信息。
再新建import_goods_data.py如下:
import sys, os pwd = os.path.dirname(os.path.realpath(__file__)) sys.path.append(pwd + '../') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Fresh_Ecommerce.settings') import django django.setup() from goods.models import Goods, GoodsCategory, GoodsImage from db_tools.data.product_data import raw_data for goods_detail in raw_data: goods = Goods() goods.name = goods_detail['name'] goods.market_price = float(goods_detail['market_price'].replace('¥', '').replace('元', '')) goods.shop_price = float(goods_detail['sale_price'].replace('¥', '').replace('元', '')) goods.goods_brief = goods_detail['desc'] if goods_detail['desc'] is not None else '' goods.goods_desc = goods_detail['desc'] if goods_detail['desc'] is not None else '' goods.goods_front_image = goods_detail['images'][0] if goods_detail['images'] is not None else '' category_name = goods_detail['categorys'][-1] category = GoodsCategory.objects.filter(name=category_name) if category: goods.category = category[0] goods.save() for goods_image in goods_detail['images']: goods_iamge_instance = GoodsImage() goods_iamge_instance.image = goods_image goods_iamge_instance.goods = goods goods_iamge_instance.save() print('Goods data imported successfully')
单独运行该文件,打印:
Goods data imported successfully
即数据导入成功。
因为商品关系到图片,因此需要再settings.py中设置图访问路径,如下:
STATIC_URL = '/static/' MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
urls.py配置如下:
from django.conf.urls import url from django.views.static import serve import xadmin from Fresh_Ecommerce.settings import MEDIA_ROOT urlpatterns = [ url(r'^xadmin/', xadmin.site.urls), url(r'^media/(?P<path>.*)$', serve, {'document_root':MEDIA_ROOT}), ]
再访问后台如下:
显然,数据已经插入成功。