Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入(下)

简介: 文章目录一、项目初始化二、数据模型设计1.用户数据模型设计2.商品数据模型设计3.交易数据模型设计4.用户操作数据模型设计三、xadmin后台管理系统的配置四、数据迁移和数据导入1.migration原理和表的生成2.导入商品类别和商品数据

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}),
]

再访问后台如下:


显然,数据已经插入成功。

相关文章
|
3月前
|
存储 前端开发 应用服务中间件
Django 实战:静态文件与媒体文件从开发配置到生产部署
Django项目中,静态文件(Static Files)和媒体文件(Media Files)是两类不同用途的文件。本文详细介绍了它们的区别、配置方法以及在开发与生产环境中的处理方式,并结合用户头像上传功能进行实战演示,最后讲解了如何通过Nginx或OpenResty部署静态与媒体文件服务。
164 1
|
11月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
490 67
|
11月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
626 45
|
12月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
710 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
11月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
351 2
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
326 0
|
负载均衡 应用服务中间件 网络安全
Django后端架构开发:Nginx服务优化实践
Django后端架构开发:Nginx服务优化实践
231 2
|
26天前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
170 2
|
4月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
622 0
|
4月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能